2016-12-22 5 views
-1

Насколько я знаю, следующий код не должен запускаться.Объявление массива размера в c

Первая проблема заключается в объявлении «int i» внутри цикла, а не в стартовом коде.

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

Ожидается, что я получу «сегментный fualt».

я запустить его с помощью команды:

gcc -Wall commandLineArgument.c -o ex1

int main(void){ 
    int size=0; 
    printf("enter number:\n"); 
    scanf("%d",&size); 
    printf("The size is: %d\n",size); 
    int arr[size]; 
    for(int i= 0;i<size;i++) 
    { 
    arr[i] = 5; 
    } 

    for(int i= 0;i<size;i++) 
    { 
    printf("%d,",arr[i]); 
    } 
    printf("\n"); 
    return 0;} 

редактировать если переменной длины массивы были поддержаны в C, так как C99 тогда как код обновления работает?

gcc -Wall -std=c89 commandLineArgument.c -o ex1 

int main(void){ 
int i; 
int size=0; 
printf("enter number:\n"); 
scanf("%d",&size); 
printf("The size is: %d\n",size); 
int arr[size]; 
printf("The size of arr: %lu\n",sizeof(arr)); 
for(i= 0;i<size;i++) 
{ 
    arr[i] = 5; 
} 

for(i= 0;i<size;i++) 
{ 
    printf("%d,",arr[i]); 
}  
printf("\n"); 
return 0;} 
+2

Возможный дубликат [Сохранять значения массива из пользовательских длин массивов] (http://stackoverflow.com/questions/18951151/store-array-values-from-user-defined-array-lengths) –

+2

и так, что ваш вопрос? – artm

+0

Для первой части это разрешено в C, но не в C++. Для второй части каждый определенный «i» имеет область действия соответствующего цикла. –

ответ

1

Это анахронизм: ваш код действителен с учетом C99 и включает C99.

С по меньшей мере C99 вы можете объявить i локально в цикле for.

И массивы переменной длины были поддержаны в C с C99. (Обратите внимание, что это не поддерживается даже в C++ 17).

+0

Имеет * автоматическую продолжительность хранения *; это стандарт. Думаю, вы можете думать об этом как о стеке. – Bathsheba

+0

ok, это массив, расположенный в стеке? – dids

+1

Стандарт C не имеет понятия * stack *. Вот почему я стараюсь не говорить об этом. Я не уверен, что он должен быть сохранен в том же месте, что и массив фиксированного размера той же длины, что и размер.Возможно, спросите, что в качестве вопроса, помечая его C и адвоката языка? – Bathsheba

1

Похоже, вы используете старую версию gcc.

Две функции, которые вы пытаетесь использовать, были добавлены в C99. Значение по умолчанию для gcc версий старше версии 5 заключается в компиляции с использованием старого стандарта C89. Чтобы использовать функции, добавленные в более поздних стандартах, вам нужно явно указать более старые версии gcc для использования более нового стандарта.

Опция компилятора -std=c11 поручает gcc использовать текущий стандарт C11. Минимальный размер: -std=99.

я рекомендовал бы вам сказать gcc использовать текущий стандарт:

gcc -Wall -std=c11 commandLineArgument.c -o ex1 

Другой способ решить проблему заключается в обновлении до gcc v5 или более поздней версии.

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