В программировании на C я столкнулся с ситуацией, когда я случайно инициализировал массив с переменным размером, и это сработало. Я провел небольшое исследование, и, по-видимому, массивы переменной длины доступны из компиляции C99. Судя по всему, параметр компиляции GCC 4.8.2 по умолчанию — C98.
Вот код, который я использовал для тестирования:
#include "stdio.h"
#include "stdlib.h" // rand(), srand()
#include "time.h"
void printArray(const char* c) {
// impossible to get size of c because it returns pointer size
int array[sizeof(c)/sizeof(char)];
int i;
for(i=0; i<(sizeof(c)/sizeof(char))-1; i++) {
int fill=-1;
if(c[i]=='a')
fill = 0;
else if(c[i]=='b')
fill = 1;
array[i]=fill;
}
printf("contents of array in binary: \n");
for(i=0; i<(sizeof(c)/sizeof(char))-1; i++) {
printf("%d, ", array[i]);
}
printf("\n");
}
void printRandomArray() {
srand(time(NULL));
// variable length array is possible using C99
int array[rand()%10];
int i;
printf("contents of random array: \n");
for(i=0; i<(sizeof(array)/sizeof(int)); i++) {
array[i]=rand()%10;
printf("%d, ", array[i]);
}
printf("\n");
}
int main(int argc, char* argv[]) {
char c[]="abbabbabbaababababababb";
printArray(c);
printRandomArray();
return 1;
}
printRandomArray() не должен работать, потому что я скомпилировал с использованием GCC 4.8.2 по умолчанию, то есть C98, но он работает. Может ли кто-нибудь объяснить мне, почему это так?
-std=c89 -pedantic
и-Werror
или-Werror=vla
- person BLUEPIXY   schedule 10.01.2015-pedantic
, теперь все в порядке. - person Bill Lynch   schedule 10.01.2015