On Tue, 7 Oct 2014, Dmitrii Kashin wrote:
yuri.nefedov@gmail.com writes:On Tue, 7 Oct 2014, dm.fedorov wrote:7 октября 2014 г., 18:45 пользователь <yuri.nefedov@gmail.com> написал:А вот если sizeof будет вызываться во время выполнения,Не бывает.Я бы не был бы так уверен ) ... printf(" sizeof(int[%i])= %lu\n",n,sizeof(int[n]));Я бы предположил, что это на этапе компиляции преобразуется в нечто вроде n*sizeof(int)
Правильно ). Вот результат работы компилятора (gcc -Wall -S -fdump-tree-all test_sizeof.c) для -------------------------------------------------- void print_size(int n){ int test[n]; printf(" sizeof(n=%i)= %lu\n",n,sizeof(test)); } -------------------------------------------------- ... print_size (int n) { ... n.0_3 = n_2(D); ... _18 = (sizetype) n.0_3; _19 = _18 * 4; printf (" sizeof(n=%i)= %lu\n", n_2(D), _19); ... Более серьезное испытание это такой код: -------------------------------------------------- void print_size(int n){ struct{char c[n+2]; int test[n];} test; printf(" sizeof(n=%i)= %lu\n",n,sizeof(test)); } int main() { int n = 10; scanf("%i",&n); print_size(n); printf("static n=3 size= %lu\n",sizeof(struct{char c[5]; int test[3];})); return 0; } -------------------------------------------------- Но и тут gcc проявляет чудеса изворотливости и правильно считает даже выравнивание полей. -------------------------------------------------- 3 sizeof(n=3)= 20 static n=3 size= 20 -------------------------------------------------- А вот clang на этом примере загнулся с диагностикой: 'variable length array in structure' extension will never be supported Что-то это да значит... Ю.