On Tue, 7 Oct 2014, Dmitrii Kashin wrote:
[email protected] writes:
On Tue, 7 Oct 2014, dm.fedorov wrote:
7 октября 2014 г., 18:45 пользователь <[email protected]> написал:
А вот если 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
Что-то это да значит...
Ю.