我是刚开始使用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/

10-11 18:26