gpt4 book ai didi

c - 将 (void*) 转换为 (int*) 时出现段错误

转载 作者:太空宇宙 更新时间:2023-11-04 07:13:10 25 4
gpt4 key购买 nike

我写了一个输出质数的多线程 Pthread 程序。该程序的工作方式如下:用户将运行该程序并在命令行中输入一个数字。然后程序将创建一个单独的线程,输出小于或等于用户输入的数字的所有质数。代码:

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<math.h>
#include<string.h>

#define true 1
#define false 0
void* print_prime(void* arg)
{
int temp;
temp = *((int*)arg);//If I change it to 'temp = (int)arg',it runs well
int flag;
int i,j;
for(i = 2 ; i <= temp ; i++)
{
flag = true;
for(j = 2 ; j <= (int)sqrt(i) ; j++)
{
if(i%j == 0)
{flag = false;break;}

}
if(flag == true)
printf("%d\n",i);
}
}
int main(int argc,char *argv[])
{
pthread_t tid;
pthread_attr_t attr;

pthread_attr_init(&attr);

if(argc != 2)
{perror("Parameters not enough");exit(0);}
int arg = atoi(argv[1]);
if(pthread_create(&tid,&attr,print_prime,(void*)arg))
{perror("Pthread created not successfully");exit(0);}

pthread_join(tid,NULL);

return 0;

}

当我在终端中写为:./pthread_test 10时,出现了segmentation fault(core dump)。我使用了dmesgaddr2line -e pthread_test 0xxxxxx 定位错误,转向指令temp = *((int*)arg)。在pthread_create(&tid,&attr,print_prime,(void*)arg)中,我已经将arg转换为void*类型的变量,为什么我使用 *(int*)arg 有误吗?

最佳答案

当您将 int 作为指向 void 的指针传递时,它不会改变您发送的是 int 的值而不是其地址的事实。当您执行 *(int *) 时,您正在尝试获取您将从参数 void 中获取的地址(指向 int 的指针)的内容。显然,因为您发送的是 int 中的值而不是它的地址,所以它不会起作用。尝试做 (void *)(&arg)。但我认为这是毫无意义的类型转换。为什么你需要做 *(int *)?有什么特别的原因吗?你明白void指针的概念吗?

关于c - 将 (void*) 转换为 (int*) 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26792409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com