2010-11-24 1 views
10

Я пытаюсь сделать массив с переменным размером в c.Почему массив большой переменной длины имеет фиксированное значение -1, даже если он назначен в 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; 
} 
+0

дубликат http://stackoverflow.com/questions/448844/variable-sized-arrays-in-c – alvin 2010-11-24 17:40:15

+0

Код выглядит нормально, но размер большой. Вы уверены, что ваша программа имеет 18 МБ стека для использования? – 2010-11-24 17:49:44

+0

@Steve. Я смущался о том, сколько элементов я хочу, чтобы мой массив удерживался, и фактический размер. – dubbeat 2010-11-24 17:54:08

ответ

9

Что вам нужно это динамический массив. Один из них позволяет выделить начальный размер, затем используйте 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. */ 
    } 
} 
4

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

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

// do something with ar 

free(ar); 
-1

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

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

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

1

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

Смежные вопросы