可变大小的对象可能未初始化

时间:2019-03-23 00:44:16

标签: c

我收到错误variable sized object may not be initialized,但我不明白为什么。

有人可以告诉我如何解决此问题吗?

int arr[size] = (int *)(augs->one);

这是我的代码:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <pthread.h>
#include <assert.h>

int count = 0;

int cmpfunc(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

struct structure {
    int two;
    int *one;
};

void *sort(void *augments) {
    struct structure *augs = (struct structure*)augments;

    int i = 0;
    int size = 1;
    size = augs->two;

    int arr[size] = (int *)(augs->one);
    //int *arr = (int *)data;
    //printf("sizeof:%d\n", sizeof(arr));

    qsort(arr, size, sizeof(int), cmpfunc);
    printf("finaloutput:\n");
    for (i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }

    printf("\n");
    return NULL;
}

int main(int argc, char *argv[]) {
    FILE *myFile;
    myFile = fopen("data.txt", "r");
    // number of lines in file
    char charicter;

    for (charicter = getc(myFile); charicter != EOF; charicter = getc(myFile)) {
        if (charicter == '\n') {
            count++;
        }
    }

    printf("count is %d\n", count);

    int numberArray[count];
    int i = 0;

    if ((myFile = fopen("data.txt", "r"))) {
        while ((fscanf(myFile, "%d", &numberArray[i]) != EOF)) {
            ++i;
        }
        fclose(myFile);
    }

    assert(argv[1] != NULL);
    int num = atoi(argv[1]); //num equals number input
    int arrayarray[num - 1][(count / num)];
    int idx;

    for (i = 0; i < (count); i++) {
        printf("numberarray[%d]= %d\n", i, numberArray[i] /*[0],numberArray[i][1]*/);
    }

    for (i = 1; i < num + 1; i++) {
        for (idx = 0; idx < (count / num); idx++) {
            arrayarray[i - 1][idx] = numberArray[i * idx];
        }
    }

    ///*
    for (i = 0; i < ((count / num)); i++) {
        printf("arrayarray[0]=%d\n", arrayarray[0][i]);
    }
    //*/

    int lastarray[((count / num) + (count % num))];
    for (idx = 0; idx < ((count / num) + (count % num)); idx++) {
        lastarray[idx] = numberArray[idx + ((count / num) * (num - 1))];
    }

    for (i = 0; i < ((((count / num) + (count % num)))); i++) {
        printf("lastaray[%d]=%d\n", i, lastarray[i]);
    }
    //*******************
    pthread_t thread_id_arr[num];

    for (i = 0; i < num; i++) {
        pthread_t tid;
        struct structure *augs;

        if (i != (num - 1)) {
            augs = malloc(sizeof(struct structure) + sizeof(int) + sizeof(int) * num);
            (*augs).one = arrayarray[i];
            (*augs).two = (count / num);

            pthread_create(&tid, NULL, sort, augs);
        } else {
            (*augs).one = lastarray;
            (*augs).two = (count / num) + (count % num);

            pthread_create(&tid, NULL, sort, augs);
            //pthread_create(&tid, NULL, sort, (void*)lastarray);
        }

        thread_id_arr[i] = tid;
    }

    for (i = 0; i < num; i++) {
        pthread_join(thread_id_arr[i], NULL);
    }

    return 0;
}

1 个答案:

答案 0 :(得分:3)

正如其他人指出的那样,您无法像执行操作一样使用指针初始化可变长度数组。但是,您实际上根本不需要VLA。改用它:

int *arr = augs -> one;

您想直接对传递到线程中的数组进行操作,而不是对其进行复制。

话虽如此,我看到了另一个问题。在产生排序线程的循环中,您没有在上一次循环迭代中分配新的args,而是重用了先前迭代中分配的args,这可能导致第二到第二次灾难。最后一个线程。您需要将malloc()调用移到if上方。

此外,malloc()分配的内存超出了线程实际使用的内存。您只需要为结构本身分配足够的内存,而不必为结构后的任何整数分配内存。

另外,当每个线程都使用分配的args完成操作时,它需要free() args以避免内存泄漏。