gpt4 book ai didi

c - 在 C 中使用线程的段错误

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

我在这段代码中遇到了一个段错误,但我找不到任何地方的问题。它使用 -lpthread 编译得很好,但就是无法运行。该程序从命令行获取一个整数,然后创建一个新线程来使用该值计算 collat​​z 猜想。这是我的代码:

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

void print_con();
void calc_con(int *n);

int * values[1000];

int main(int argc, char * argv[])
{
int* num;
*num = 15;
pthread_t thread;
pthread_create(&thread,(pthread_attr_t*)NULL, (void *)&calc_con, (void *)num);
pthread_join(thread, NULL);
print_con();
return 0;

void calc_con(int *n)
{
int i = 0;
int * x;
*x = *n;
*values[0] = *x;
while(*x > 1)
{
if(*x % 2 == 0)
*x /= 2;
else if(*x % 2 == 1)
{
*x *= 3;
*x++;
}
i++;
*values[i] = *x;
}
pthread_exit(0);
}

void print_con()
{
int i;
for(i = 0; i < 1000; i++)
{
if(*values[i] > 0)
printf("%d", *values[i]);
}
}

最佳答案

好的,您需要void * 作为参数传递给pthread_create,但您仍然需要遵守基本原则:

int* num;
*num = 15;
pthread_t thread;
pthread_create(&thread,(pthread_attr_t*)NULL, (void *)&calc_con, (void *)num);

此处 *num = 15; 您正在将 15 写入未初始化的指针。那是未定义的行为

我会这样做:

int num = 15;
pthread_t thread;
pthread_create(&thread,(pthread_attr_t*)NULL, &calc_con, &num);

请注意,您不必从非 void 指针转换为 void *。由于 num 是在 main 例程中声明的,您可以将其上的指针安全地传递给您的线程。

请注意,正如 dasblinkenlight 所指出的,您还必须在 calc_con 中修复接收端,它具有相同的问题:

int * x;  // uninitialized pointer
*x = *n; // copy data "in the woods"

只要解引用到一个局部变量,你就得到了你的值:

int x = *((int *)n);

还有一个:

int * values[1000];

是一个未初始化的整数指针数组,而不是您想要的整数数组。应该是

int values[1000];

然后

values[0] = x;

(不是因为*运算符多才算好代码)

关于c - 在 C 中使用线程的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46941835/

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