2

我正在获取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;
}
4

3 回答 3

3

问题出在下面的代码上

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

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

有很多方法可以解决这个问题,包括

  • 分配内存g
  • 观点g一些分配的内存
  • g在堆栈中声明main并将指向它的指针传递给您的子线程
于 2012-12-14T10:34:07.997 回答
2

in int *g; g 是未分配的位置地址,您正试图在该位置分配。

这样做:

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

也不要忘记free记忆。

于 2012-12-14T10:35:02.773 回答
1

你正在做:

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

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

于 2012-12-14T10:35:23.303 回答