C 从atoi分离断层
我对编写线程代码还不熟悉,对C也不熟悉。我曾尝试用gdb进行调试,在尝试使用atoi设置num的值后,我似乎遇到了一个segfault,但我不知道为什么。有人能解释这个错误吗C 从atoi分离断层,c,multithreading,pointers,C,Multithreading,Pointers,我对编写线程代码还不熟悉,对C也不熟悉。我曾尝试用gdb进行调试,在尝试使用atoi设置num的值后,我似乎遇到了一个segfault,但我不知道为什么。有人能解释这个错误吗 #include <stdlib.h> #include <stdio.h> #include <pthread.h> int *ptr; int getFibonacciNumber(int num) { if ( num <= 1 ) return 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*ptr;
int getFibonacciNumber(int num)
{
if(num
取消对未初始化指针的引用-未定义的行为
换成
int num;
num = atoi(argv[0]);
或
取消对未初始化指针的引用-未定义的行为
换成
int num;
num = atoi(argv[0]);
或
Num是一个指针,它不指向任何内容。
把它改正过来
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]);
请注意,这意味着整个主函数代码必须将num视为int
,而不是int*
num是一个指针,它不指向任何内容。
把它改正过来
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]);
请注意,这意味着整个主函数代码必须将num视为int
,而不是int*
,因为num
没有初始化为指向任何对象(或者更确切地说,编译器可能将其设置为空指针),所以您将得到一个segfault。然后尝试为此垃圾指针分配变量
您必须malloc
一些内存才能使用它,或者只是将其声明为静态变量,并在必要时使用一元&
创建指向它的指针,因为num
未初始化为指向任何对象(或者更确切地说,编译器可能将其设置为空指针),因此您将获得一个segfault。然后尝试为此垃圾指针分配变量
int* num;
*num = atoi(argv[0]);
您必须malloc
一些内存才能使用它,或者只是将它声明为静态变量,并在必要时使用一元和创建指向它的指针
int* num;
*num = atoi(argv[0]);
num
是一个指针,在向其写入内容之前,它应该指向某个有效的内存位置。在您的情况下,您不这样做,所以您会看到分段错误
如果argc大于0,argv[0]
将始终是程序的名称
如果argc的值大于零,则数组成员argv[0]
通过argv[argc-1]应包含指向字符串的指针,
这些是主机环境给定的实现定义的值
在程序启动之前。目的是向程序提供
在程序启动之前从程序中的其他位置确定的信息
托管环境。[…]
如果argc的值大于零,
argv[0]指向的字符串表示程序名;
如果程序名不是空的,则argv[0][0]应为空字符
可从主机环境获得。[…]
PS:atoi(NULL)
导致崩溃,并且argv[0]
可能为NULL
num
是一个指针,在向其写入内容之前,它应该指向某个有效的内存位置。在您的情况下,您不这样做,所以您会看到分段错误
如果argc大于0,argv[0]
将始终是程序的名称
如果argc的值大于零,则数组成员argv[0]
通过argv[argc-1]应包含指向字符串的指针,
这些是主机环境给定的实现定义的值
在程序启动之前。目的是向程序提供
在程序启动之前从程序中的其他位置确定的信息
托管环境。[…]
如果argc的值大于零,
argv[0]指向的字符串表示程序名;
如果程序名不是空的,则argv[0][0]应为空字符
可从主机环境获得。[…]
PS:atoi(NULL)
导致崩溃,并且argv[0]
可能为NULL