[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Чёртов язык Си!



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

 Что-то это да значит...
Ю.

Reply to: