为什么这段代码会触发分段错误?

时间:2012-12-14 10:31:10

标签: c pthreads posix

我得到Segmentation Fault以下代码很奇怪因为我没有看到我在哪里访问未初始化的内存。我试图调试代码,发现这个分段错误与线程过程中的*g有关。这是代码:

void *Func(void *arg);

int main()
{
    pthread_t tid;
    void *x;

    pthread_create(&tid,NULL,Func,NULL);
    pthread_join(tid,&x);
    int i=*(int *)x;
    printf("Data returned from the thread %d\n",i);

    return 0;
}

void *Func(void *arg)
{
    int *g;
    int i=2,j=3;
    printf("inside thread\n");      
    *g=i+j;
    printf("%d\n",*g);

    return g;
}

3 个答案:

答案 0 :(得分:3)

问题在于以下代码

int *g;
....
*g=i+j;

g是一个未初始化的指针。当您取消引用它时,您正在尝试写入内存中未定义的位置。这种影响是不明确的,但很可能是一个段错误。

您可以通过多种方式解决此问题,包括

  • g
  • 分配内存
  • 指向某个已分配的内存g
  • g中的堆栈上声明main并将指针传递给您的子线程

答案 1 :(得分:2)

int *g; g中的

是未分配的位置地址,您尝试在该位置分配。

这样做:

int *g=calloc(1, sizeof(int)) ;

另外不要忘记free记忆。

答案 2 :(得分:1)

你在做:

int *g;
...
*g=i+j;

g是一个未初始化的指针,您正在尝试写入它指向的位置,这会导致未定义的行为。