我正在创建一个线程并将指针传递给它。 但是当我将这个指针转换为应该返回的时候(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);
}
答案 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 :(得分: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,因此发生了段错误。