使用C

时间:2017-10-25 20:51:17

标签: c multithreading segmentation-fault

我在此代码中遇到了段错误,但我无法在任何地方找到问题。它使用-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]);
        }
}

2 个答案:

答案 0 :(得分:3)

好吧,你需要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 *。由于在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;

(不是因为很多*运营商认为这是一个很好的代码)

答案 1 :(得分:1)

您正在使用intvoid*传递给您的主题。这将适用于许多平台,但无法保证该数字会“往返”#34;正确。一旦你获得指针,你将它保存在一个取消引用的未初始化指针,这是不正确的。

将指针传递给num,然后将指针直接复制到x

void calc_con(void *n);
...
void calc_con(void *n) {
        int i = 0;
        int * 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);
}
...
int num = 15;
pthread_create(&thread,(pthread_attr_t*)NULL, calc_con, (void *)&num);