2014-12-11 5 views
2
#include<stdio.h> 

main() { 
    int a=5; 
    int array[a]={0}; 
    printf("Success\n"); 
} 

, когда я уверен, выполнение программы она будет через ошибки, какПочему я не могу инициализировать массив?

b.c: In function ‘main’: 
b.c:8:1: error: variable-sized object may not be initialized 
b.c:8:1: warning: excess elements in array initializer [enabled by default] 
b.c:8:1: warning: (near initialization for ‘array’) [enabled by default] 

В куб.см компилятором. но я могу назначить как это

int array[5]={0}; 

Если меня исправить?

+0

использовать '-std = c99' как CFLAGS при компиляции этой программы –

+0

@Bhuvanesh Вы проверили свой код с помощью cc -E. В этой переменной отсутствует значение, которое должно быть помещено в размер массива. –

ответ

4

Это утверждение

int array[a]={0}; 

объявляет переменную длину Array (VLA).

Согласно стандарту C (6.7.9) Инициализация

3 типа объекта, чтобы быть инициализирован должен быть массивом неизвестного размера или полный тип объекта , который не является переменной длины массив type.

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

Рассмотрим пример

void f(size_t n) 
{ 
    int a[n] = { 1, 2, 3, 4, 5 }; 
    //... 
} 

Вот является переменной массива длины. Теперь, когда n может иметь любое значение, количество инициализаторов в определении массива может быть больше размера массива. Таким образом, этот код нарушает стандарт с другой стороны, потому что количество инициализаторов может быть не больше числа элементов массива. С другой стороны, если количество инициализаторов меньше числа элементов массива, то что делать в этом случае? Возможно, программист не имел в виду, что некоторые элементы должны быть инициализированы нулями.

Что касается этого заявления

int array[5]={0}; 

, то нет переменной массива длины. Размер массива известен во время компиляции. Поэтому нет проблем

.

+0

, но мы можем объявить массив как array [a] ;, но проблема в том, что мы инициализируем тогда только ошибку. – Bhuvanesh

+0

@Bhuvanesh: Цитата, которую Влад упоминает, явно заявляет, что вы не можете инициализировать массив переменной длины. – Cornstalks

+0

Хорошо сделано для того, чтобы быть единственным человеком, который мог бы ответить на реальный вопрос. – Cornstalks

1

"автоматические массивы переменной длины допустимы в ISO C99, и как расширение GCC принимает их в режиме C90 и C++"

говорит here.

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

#include<stdio.h> 
#DEFINE A 5 

main() 
{ 
int array[A]={0}; 
printf("Success\n"); 
} 
+0

То же самое, что и запись int a [5] = {0}, поскольку препроцессор будет разрешен во время самого компиляции. –

+0

_Это должно работать **, если вам действительно нужно это сделать ** _ –

0

Поля элементов в квадратных скобках [], представляющие собой количество элементов в массиве, должен быть константным выражением, поскольку массивы являются блоками статической памяти размер которого должен быть определен во время компиляции до запуска программы.

+0

@Akilesh Jaiswal - но оба являются локальными переменными. это будет работать во время выполнения – Bhuvanesh

+0

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

+0

Это VLA, поэтому размер массива не обязательно должен быть постоянным выражением. – Lundin

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