Подтвердить что ты не робот

Динамические массивы в C без malloc?

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

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 получает все равно, и программа работает нормально, распечатывая оригинал и копию. И Valgrind не жалуется ни на что.

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

"Переменные массивы длины" были добавлены на язык C на C99. Об этом говорится в §6.7.5.2 "Декларации массива":

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

Ответ 4

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

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