Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从atoi分离断层_C_Multithreading_Pointers - Fatal编程技术网

C 从atoi分离断层

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;

我对编写线程代码还不熟悉,对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;
    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