我是刚开始使用C编写线程代码并且生锈。我尝试使用gdb进行调试,在尝试使用atoi设置num的值后,似乎出现了段错误,但是我不确定为什么。谁能解释这个段错误?
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
int *ptr;
int getFibonacciNumber(int num)
{
if ( num <= 1 ) return num;
else if ( ptr[num] != 0 ) return ptr[num];
else{
int fibOfNMO = getFibonacciNumber(num - 1);
int fibOfNMT = getFibonacciNumber(num - 2);
ptr[num] = fibOfNMO + fibOfNMT;
return ptr[num];
}
}
void* fibonacci(void* arg)
{
int* num = (int*)arg;
int fib = getFibonacciNumber(*(num));
return NULL;
}
int main(int argc, char** argv)
{
printf("%s", argv[0]);
pthread_t tid_main;
pthread_t tid_fib;
int ret;
int* num;
*num = atoi(argv[0]);
if ( argv[0] != NULL ) ptr = (int*)malloc((*(num) + 1)*sizeof(int));
else exit(EXIT_FAILURE);
int i;
for (i = 0; i < *(num) + 1; ++i) ptr[i] = 0;
ptr[1] = 1;
printf("%d\n", getFibonacciNumber(6));
ret = pthread_create(&tid_fib, NULL, fibonacci, num);
if (ret) {
fprintf(stderr, "error -- pthread_create() failed.\n");
exit(EXIT_FAILURE);
}
ret = pthread_join(tid_fib, NULL);
if (ret) {
fprintf(stderr, "error -- pthread_join() failed.\n");
exit(EXIT_FAILURE);
}
printf("%d\n", ptr[*(num)]);
free(ptr);
return 0;
}
最佳答案
int* num;
*num = atoi(argv[0]);
取消引用未初始化的指针-未定义的行为。
更改为
int num;
num = atoi(argv[0]);
或者
int *num = malloc(sizeof(int));
*num = atoi(argv[0]);
关于c - 来自atoi的Segfault,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28209594/