2013-07-05 3 views
0

Согласно C99 стандартам, которые мы можем сделать этоДинамическая инициализация массива в с

int n = 0; 
scanf("%d",&n); 
int arr[n]; 

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

int arr[n] = {0}; 

Вот моя ошибка производящего компилятора. Я хочу знать, можем ли мы это сделать? Это по стандарту? Во время компиляции мы обеспечиваем достаточную память для массивов, но здесь она неизвестна во время компиляции. Как это происходит?

+0

Если вы хотите иметь по-настоящему динамический массив, который инициализируется при создании, используйте 'calloc'. В моем компиляторе GCC ошибка «размер переменной объекта не может быть инициализирована» довольно описательна, допустимо или нет. – Nobilis

+2

Явным образом запрещается инициализировать массив переменной длины в соответствии с ограничением 6.7.8/3 «Тип объекта, который должен быть инициализирован, должен быть массивом неизвестного размера или типа объекта **, который не является массивом переменной длины ** «. – dyp

+0

Всегда полезно включить текст сообщения об ошибке, на который ссылается вопрос. – MikeW

ответ

7

можем ли мы это сделать?

Нет, но вы можете сделать это:

int arr[n]; 
memset(arr, 0, sizeof(arr)); 

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

0
int n = 0; 
scanf("%d",&n); 
int arr[n]; 

Вы не можете сделать это. Если вы хотите выделить память массиву, используйте функции malloc или calloc.

+2

V (допустимый) L (ength) A (массив) поставляется с C99. – alk

+0

Это 1. неправильно, 2. не то, о чем спрашивает ОП. –

+0

Ты говоришь со мной? @ H2CO3 – alk

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