C - pthread分段错误11

时间:2016-01-16 14:46:25

标签: c pointers segmentation-fault pthreads

我正在创建一个线程并将指针传递给它。 但是当我将这个指针转换为应该返回的时候(int *)我有一个分段错误。

int *ptr = (int *)ptrTotal2;

以下是代码:

void *firstCalc(void *ptrTotal2){
  int valA = 1;
  int valB = 2;
  int *ptr = (int *)ptrTotal2;
  *ptr = valA + valB;
  printf("Value of valA = %d\nValue of valB = %d\n", valA, valB);
  printf("Value of subtotal *ptrTotal1 = %d\n", *ptr);
  pthread_exit(NULL);
}

int main(int argc, char **argv) {

  pthread_t thread1;
  int *ptrTotal2 = 0;
  int iret1;

  iret1 = pthread_create(&thread1, NULL, firstCalc, (void*) ptrTotal2); 
  if(iret1){
    fprintf(stderr,"Error - pthread_create() return code: %d\n",iret1);
    exit(EXIT_FAILURE);
  }

  pthread_join( thread1, NULL);

  exit(EXIT_SUCCESS);

}

4 个答案:

答案 0 :(得分:1)

在函数ptr中解除引用firstCalc,当原始指针设置为0时,将导致未定义的行为,在您的情况下会出现分段错误。

int *ptr = (int *)ptrTotal2;
*ptr = valA + valB;
...
int *ptrTotal2 = 0;

而是为整数分配内存,并将其传递给创建的线程,并在线程结束后释放它:

int *ptrTotal2 = malloc( sizeof( int ) );
if( !ptrTotal2 )
{
    abort();
}

//... call pthread_create, pthread_join

free( ptrTotal2 );

注意,您必须使用已分配的内存(使用malloc),因为从另一个线程读取自动变量是实现定义的。

  

6.2.4对象的存储持续时间

     
      
  1. 的   尝试间接访问具有自动存储持续时间的对象的结果   与对象关联的线程以外的线程是实现定义的。
  2.   

答案 1 :(得分:0)

您解除引用NULL指针,导致分段错误,因为它的行为未定义。

试试这个

int value = 0;
int *ptrTotal2 = &value;

并请保持pthread_join(thread1, NULL);value将被取消分配,并再次未定义的行为

答案 2 :(得分:0)

指定指针时,你没有得到分段错误,你得到它,因为你在稍后尝试取消引用指针,这是NULL。

在您的main()中,您已撰写

 int *ptrTotal2 = 0;

基本上

相同
 int *ptrTotal2 = NULL;

现在,在线程函数中,你正在做

 *ptr = valA + valB;

尝试取消引用NULL指针。这会调用undefined behavior。分割错误是UB的副作用之一。

你可以尝试做的是

  • ptrTotal2设为int,例如int ptrTotal2 = 0;
  • 传递地址,例如iret1 = pthread_create(&thread1, NULL, firstCalc, &ptrTotal2);

答案 3 :(得分:0)

您可以尝试printf ptr指针的值。它是NULL指针,因为ptrTotal2也是NULL指针。然后在下面的表达式中

*ptr = valA + valB;

*ptr试图从ptr指向的地址取消引用,不幸的是ptr指向NULL,因此发生了段错误。