2015-08-05 2 views
-4

Следующий фрагмент скомпилирован правильно с использованием стандарта gcc. Каковы возможные подводные камни здесь? - особенно для разработки уровня ядра.Ловушки массива с переменным размером в C

int n; 

f(){n=2;} 
g(){int b[n];} 

main(){ 
     int a[n]; 
     f(); 
     g(); 
} 
+1

Он не компилируется ('2: ошибка: изменено с изменением 'c' в области видимости файла). – cremno

+0

n - 0 во время компиляции, а int c [n] будет массивом нулевой длины, потому что структуры разрешаются во время компиляции. –

+0

Поскольку структурам ядра часто приходится пережить вызовы, которые их повышают, казалось бы, ограниченная полезность, даже если она выделена в стек ядра (в любом случае, ограниченного размера). Couse, глобальный VLA не имеет смысла (или компиляции), во всяком случае :( –

ответ

4

Это неверный код, потому что массивы переменной длины не может иметь размеры, равные 0. В вашем примере, файл-сфера переменная n инициализируется 0.

Этот массив

int a[n]; 

имеет нулевой размер, потому что переменная n была инициализирована нолем как статическая продолжительность хранения.

Чтобы получить действительную программу, вы должны написать что-то вроде следующего

#include <stdio.h> 

int n; 

void f(void){n=2;} 
void g(void){int b[n]; printf("sizeof(b) = %zu\n", sizeof(b)); } 

int main(void) 
{ 
     f(); 
     int a[n]; 
     printf("sizeof(a) = %zu\n", sizeof(a)); 
     g(); 
}  

Примите во внимание, что VLA (s) были введены в C99 и в то же время Standard подавленной типа возвращаемого по умолчанию int функций ,

+1

Кто такой умный, что проголосовали за ответ –

+0

@Ali Abbasinasab Это вы проголосовали? –

+0

Почему вы убрали мой ответ? И почему вы дезактивировали мою учетную запись? Интересная личность! –

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