从线程传递数组

Tay*_*ams 5 c arrays primes multithreading

对于学校我有一个多线程的任务.每个线程都应该从控制台输入中获取一个数字,找到它的所有素数,并将所有这些素数作为数组返回.我正在努力以这种方式返回数组,以便我可以显示它.这是我的一些代码:

    int *number;

    for (int i =1; i < argc; i++) {
        pthread_create(&thread[i], NULL, prime_nums, (void*)argv[i]);
    }
    for (int i =1; i < argc; i++) {
        pthread_join(thread[i],(void**) &number);
        printf("%d\n", *(number + 0)); //This is just to test if the variable is correct
    }
Run Code Online (Sandbox Code Playgroud)

...

void *prime_nums(void*m) {
    int n = atoi(m);
    int count = 0;
    int f = 2;
    int primeNumbers[MAX_PRIME];
    /*printf("%d: ", n);*/
    while (n > 1 && count < MAX_PRIME) {
        if (n % f == 0) {
            primeNumbers[count++] = f;
            n /= f;
        }
        else {
            f += 1;
        }
    }
    /*printf("\n");*/
    int test[2];
    test[0] = 0;
    test[1] = 1;
    test[2] = 2;
    pthread_exit(test);
}
Run Code Online (Sandbox Code Playgroud)

我已经检查了primeNumbers我的线程中的数组,并且数组中的数据是正确的,但我无法弄清楚如何将该数组保存到我的main函数中的另一个数组.

dbu*_*ush 3

线程函数中的数组test是一个局部变量,当函数返回(并且线程退出)时,它会超出范围。返回局部变量的地址并随后取消引用该地址会调用未定义的行为

您需要为数组动态分配内存并返回该指针:

void *prime_nums(void*m) {
    ...
    int *test = malloc(sizeof(int) * 3);
    test[0] = 0;
    test[1] = 1;
    test[2] = 2;
    pthread_exit(test);
}
Run Code Online (Sandbox Code Playgroud)

另外,第二个参数pthread_exit应该是 a 的地址void *

void *rval;
int *number
pthread_join(thread[i], &rval);
number = rval;
Run Code Online (Sandbox Code Playgroud)