генерация ошибок gcc

#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 (не стандартная, а черновик, причем бесплатный. 🙂