Почему массив большой переменной длины имеет фиксированное значение -1, даже если он назначен в C?

Я пытаюсь сделать массив с переменным размером в c.

Массив продолжает возвращаться как имеющий значение -1. ​​

Я хочу сделать массив размером size, а затем поэтапно добавить к нему значения. Что я делаю неправильно?

int size = 4546548;

UInt32 ar[size];
//soundStructArray[audioFile].audioData = (UInt32 *)malloc(sizeof(UInt32) * totalFramesInFile);
//ar=(UInt32 *)malloc(sizeof(UInt32) * totalFramesInFile);
for (int b = 0; b < size; b++)
{
    UInt32 l = soundStructArray[audioFile].audioDataLeft[b];
    UInt32 r = soundStructArray[audioFile].audioDataRight[b];
    UInt32 t = l+r;
    ar[b] = t;
}

Ответ 1

Вам нужен динамический массив. Один из них позволяет выделить начальный размер, а затем использовать realloc, чтобы увеличить его размер, если это необходимо.

т.е.

UInt32* ar = malloc(sizeof(*ar) * totalFramesInFile);
/* Do your stuff here that uses it. Be sure to check if you have enough space
   to add to ar and if not, call grow_ar_to() defined below. */

Используйте эту функцию для ее увеличения:

UInt32* grow_ar_to(UInt32* ar, size_t new_bytes)
{
    UInt32* tmp = realloc(ar, new_bytes);
    if(tmp != NULL)
    {
        ar = tmp;
        return ar;
    }
    else
    {
        /* Do something with the error. */
    }
}

Ответ 2

Вы должны, вероятно, распределить (и впоследствии освободить) массив динамически, например:

int *ar = malloc(sizeof(int) * size);
for (int b = 0; b < size; b++)
{
    ...
}

// do something with ar

free(ar);

Ответ 3

если вы делаете размер const int, который должен работать. Кроме того, если ваш массив находится внутри функции, а размер - аргумент указанной функции, это тоже должно работать.

Ответ 4

C не позволяет использовать переменную при определении размера массива, то, что вам нужно сделать, это использовать malloc, это должно дать вам представление:

UInt32* ar;
ar = (UInt32*) malloc(size * sizeof(UInt32));

Не забудьте освободить его после