Зачем кому-то инициализировать нераспределенную память в C? - PullRequest
0 голосов
/ 04 января 2012

Скажем, я инициализирую массив следующим образом:

char a[]="test";

Какова цель этого? Мы знаем, что содержимое может быть немедленно изменено, так как оно не выделено , и, следовательно, почему кто-то должен инициализировать массив следующим образом?

Ответы [ 5 ]

5 голосов
/ 04 января 2012

Чтобы уточнить, этот код неверен по причинам, указанным в ОП:

char* a;
strcpy(a, "test");

Как отмечено в других ответах, синтаксис "char a [] =" test "" фактически не делает этого,Фактический эффект больше похож на этот:

char a[5];
strcpy(a, "test");

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

1 голос
/ 04 января 2012

Этот синтаксис выделяет массив из пяти символов в стеке, эквивалентный этому:

char a[5] = "test";

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

1 голос
/ 04 января 2012

выделено. Этот код эквивалентен

char a[5]="test";

Когда вы пропускаете число, компилятор просто вычисляет длину массива символов, подсчитывая символы в буквенной строке. Затем он добавляет 1 к длине, чтобы включить необходимый завершающий нуль '\0'. Следовательно, длина массива равна 5, а длина строки равна 4.

1 голос
/ 04 января 2012

Цель этого состоит в том, чтобы выделить пять байтов в стеке или статическом сегменте данных (в зависимости от того, где находится этот фрагмент), а затем установить эти байты в массиве {'t','e','s','t','\0'}.

0 голосов
/ 04 января 2012

Массив выделен ; его размер определяется из строкового литерала, который используется для его инициализации (всего 5 символов).

Если бы вы написали

char *a = "test";

тогда все, что будет выделено, будет переменной-указателем, а не массивом (строковый литерал "test" живет в памяти так, что он выделяется при запуске программы и удерживается до ее закрытия).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...