2012-04-08 3 views
3

Я читал книгу, когда я обнаружил, что размер массива должен быть предоставлен во время декларации или выделяется из кучи с помощью таНоса в runtime.I написали эту программу в C:Сложность в понимании массивов переменной длиной в C

#include<stdio.h> 

int main() { 
    int n, i; 
    scanf("%d", &n); 
    int a[n]; 
    for (i=0; i<n; i++) { 
    scanf("%d", &a[i]); 
    } 
    for (i=0; i<n; i++) { 
    printf("%d ", a[i]); 
    } 
    return 0; 
} 

Этот код работает нормально.

Мой вопрос в том, как этот код может работать корректно. Разве это не нарушение основной концепции C, размер массива должен быть объявлен до выполнения или распределить его с помощью malloc() во время выполнения. Я не делаю никаких эти две вещи, то почему она работает правильно?

Решение моего вопроса - это массивы переменной длины, которые поддерживаются в C99, но если я играю вокруг кода и ставил оператор int a [n]; выше зсапЕ ("% D, & п), после чего он перестает работать Почему это so.if массивы переменной длины поддерживаются в C

+1

c99 позволяет это. –

+0

Google для VLA .. – SuperSaiyan

+0

Ваша книга, вероятно, говорила о C89; ваш компилятор использует, возможно, C99. Это несколько разные языки (C99 - эволюция C89, C11 - эволюция C99). Одним из отличий является VLA (Variable Length Arrays). – pmg

ответ

5

Стандарт C99 поддерживает variable length arrays Длина этих массивов определяется во время выполнения

?..
+1

Если длина этих массивов определяется во время выполнения, то как распределяется память для этих массивов? Являются ли они распределены хранилищем в куче, как и в обычных массивах времени выполнения, используя malloc() или в стеке? –

+0

@dark_shadow, что зависит от реализации. Распределение кучи можно избежать, просто перемещая указатель стека во время выполнения, что и делает функция 'alloca' (расширение, предоставляемое некоторыми платформами, такими как Microsoft и GNU). –

+0

Спасибо за помощь. –

2

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

Пример:.

void foo(int n) 
{ 
    int array[n]; 

    // Initialize the array 
    for (int i = 0; i < n; i++) { 
     array[i] = 42; 
    } 
} 
+0

Не могли бы вы объяснить смысл области блока? –

+1

@dark_shadow вы можете объявить массив переменной длины в теле функции. – ouah

+0

Спасибо ouah за помощь. Пожалуйста, взгляните на мой измененный вопрос. Я добавил в него часть. Можете ли вы рассказать мне причину этого? Благодарю. –

1

с будет рад тех пор, пока вы объявили массив и выделенную память для него, прежде чем использовать его , Одной из «особенностей» C является то, что он не проверяет индексы массива, поэтому программист должен гарантировать, что все обращения к памяти действительны.

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