Динамические массивы в C без malloc? - PullRequest
20 голосов
/ 12 июля 2011

Мне всегда было интересно, как мне с этим справиться:

int main(int argc, char **argv) {
    printf("%p %s %d\n", &argv[1], argv[1], strlen(argv[1]));
    char copy[strlen(argv[1]) + 1];
    strcpy(copy, argv[1]);
    printf("%p %s %d\n", &copy, copy, strlen(copy));
    return 0;
}

Массив char copy все равно выделяется, и программа работает нормально, распечатывая оригинал и копию.И Вальгринд ни на что не жалуется.

Я думал, что динамические массивы в C невозможны без malloc.Был ли я не прав?

Ответы [ 4 ]

18 голосов
/ 12 июля 2011

Это функция C99 и может быть реализована в предыдущих версиях компилятором .

В ISO C99 разрешены автоматические массивы переменной длины и в качестве расширения GCC.принимает их в режиме C90 и в C ++.Эти массивы объявляются как любые другие автоматические массивы, но с длиной, которая не является константным выражением.Хранилище выделяется в точке объявления и освобождается при выходе из уровня скобок.

7 голосов
/ 12 июля 2011

Массивы переменной длины возникли как расширение GCC , но они также были приняты C99 .

Они все еще размещаются в стеке, поэтомуих "огромный" считается плохим стилем (и, вероятно, когда-нибудь сломается).

3 голосов
/ 12 июля 2011

Еще до существования "массивов переменной длины", любезно предоставленных gcc и C99, было:

alloca() - позволяет динамически выделять стековую («автоматическую») память.

2 голосов
/ 12 июля 2011

"Массивы переменной длины" были добавлены к языку C в C99. Это описано в §6.7.5.2 «Деклараторы массивов»:

Если размер является выражением, которое не является целочисленной константой выражение: если это происходит в объявлении в области видимости прототипа функции, он обрабатывается так, как если бы он был заменен *; в противном случае каждый раз оцениваемое значение должно быть больше нуля. Размер каждого экземпляр типа массива переменной длины не изменяется во время его продолжительность жизни. Где выражение размера является частью операнда sizeof оператор и изменение значения выражения размера не будет влияет на результат оператора, не уточняется, выражение размера оценивается.

...