#c #variables #memory-management
#c #переменные #управление памятью
Вопрос:
Почему ни gcc, ни clang не генерируют ошибку, когда я пытаюсь скомпилировать код, содержащий следующие две строки?
int palindrome(char s[]){
char s2[strlen(s)];
Я думал, что в таком случае вам придется динамически выделять память для s2.
Ответ №1:
У GCC есть расширение для такого поведения, и оно также является стандартным в C99, известное как массивы переменной длины.
http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html
Clang поддерживает это из-за GCC C и C99: http://clang.llvm.org/compatibility.html#vla
Ответ №2:
Раздел 6.7.5.2 Array declarators
:
Если размер отсутствует, тип массива является неполным типом. Если размер
*
вместо того, чтобы быть выражением, тип массива представляет собой тип массива переменной длины неопределенного размера, который может использоваться только в объявлениях с областью видимости прототипа функции), такие массивы, тем не менее, являются полными типами. Если размер является целочисленным постоянным выражением, а тип элемента имеет известный постоянный размер, тип массива не является типом массива переменной длины; в противном случае тип массива является типом массива переменной длины.
И пример из 6.5.3.4
:
#include <stddef.h>
size_t fsize3(int n)
{
char b[n 3]; // variable length array
return sizeof b; // execution time sizeof
}
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (не стандартная, а черновик, причем бесплатный. 🙂