Можно ли использовать sizeof () для определения длины массива? - PullRequest
6 голосов
/ 23 ноября 2011

Я знаю, что в C массивы не должны иметь динамический размер.

Учитывая это, будет ли разрешен следующий код?(Попытка объявить массив символов той же длины, что и double.)

char bytes[sizeof(double)];

Я предполагаю, что sizeof работает с аргументом во время выполнения программы, и поэтому это не будет разрешено, но яЯ не уверен.

Кроме того, будет ли разница, если бы это был C ++ вместо C?

Ответы [ 4 ]

8 голосов
/ 23 ноября 2011

Размер выражения sizeof вычисляется во время компиляции (компилятором, а не препроцессором), поэтому выражение допустимо.

В C99 есть исключение из этого правила, где разрешены динамические массивы. В этом случае sizeof, в зависимости от контекста, оценивается во время выполнения (http://en.wikipedia.org/wiki/Sizeof).. Это не меняет законность выражения в вопросе.

6 голосов
/ 23 ноября 2011

Да, он может и не будет даже динамического размера, потому что sizeof(double) - это константа времени компиляции.

1 голос
/ 23 ноября 2011

При условии, что его операнд не является VLA, вы можете использовать sizeof как реальное значение.

#include <stdio.h>
#include <string.h>

int main(void) {
  double x;
  unsigned char dbl[sizeof x];                             /* real constant */

  /* make x's format have a 1 bit on the "correct" place */
  x = 32.000000000000004;
  memcpy(dbl, &x, sizeof x);
  switch (dbl[0]) {
    case sizeof *dbl: puts("1"); break;                    /* real constant */
    case 0: puts("0"); break;
    default: puts("other");
  }
  return 0;
}

См. Код "работает" на http://ideone.com/95bwM

1 голос
/ 23 ноября 2011

Да, это прекрасно. Значение sizeof () определяется во время компиляции.

...