2013-08-08 2 views
2

У меня есть массив, который я хотел бы, чтобы инициализироватьИнициализация массива с использованием размера оператора?

char arr[sizeof(int)]; 

ли это выражение оценки на время компиляции постоянная или результат при вызове функции?

+1

Это действительный код, но, вероятно, он не делает то, что вы хотите. Опишите свою большую цель - что вы собираетесь вставить в этот массив? – zwol

+0

Причина, по которой я спрашиваю, я не уверен, как реализован размерof, возможно, существует постоянная времени компиляции, которая лучше подходит для этого? – Anonymous

+0

'sizeof (TYPE)' является константой времени компиляции, пока размер TYPE полностью определяется во время компиляции (что имеет место практически для всех типов). Но это не меняет того факта, что это, вероятно, не делает то, что вы хотите - не потому, что это не константа времени компиляции, а потому, что, вероятно, это неправильный размер. – zwol

ответ

0

Здесь нет инициализации. Нет ничего плохого в объявлении или определении массива с элементами sizeof(int), за исключением того, что это может показаться немного странным для читателей кода. Но если это то, что вам нужно, вот что вы должны написать.

4
char arr[sizeof(int)]; 

Что касается языка, то оно прекрасно, хотя массив только декларировала (и определяется), он не инициализирован, если это локальная переменная. Если он объявлен на уровне пространства имен, то это статически нулевой инициализации.

Отметьте, что sizeof(int) является постоянным выражением типа size_t; его значение известно во время компиляции.

+0

Это не вопрос. – Anonymous

+3

@Anonymous Ваш вопрос не использует правильный жаргон! –

+2

@Anonymous: Похоже, что на самом деле вы отвечаете на свой вопрос. – GManNickG

0

Это инициализация:

char arr[sizeof(int)] = { 'A', 'B', '0', 'F' }; 

Это, конечно, подразумевает, что sizeof(int) (по крайней мере) 4, или оно будет не в состоянии компиляции.

И ответить на фактический (новый) вопрос:

sizeof() является оператором во время компиляции. В C++ [в соответствии со стандартом некоторые компиляторы разрешают массивы переменной длины C), это не приведет к чему-либо, кроме постоянной времени компиляции. В C, с массивами переменной длины, он может стать простым вычислением (количество элементов * размер каждого элемента, где число элементов является переменной частью).

+0

И не будет компилироваться, если 'sizeof (int) == 2' (который раньше был довольно распространенным и, вероятно, все еще имел место на некоторых встроенных процессорах). –

+0

Неспособность компилировать в этом отношении хороша. Было бы намного хуже, если бы он просто счастлив ... –

+0

@JamesKanze: 'sizeof (int)' может быть как 1, хотя для этого требуется 'CHAR_BIT> = 16'. –

0

Это действительно зависит от того, как вы собираетесь использовать массив.

sizeof(int) может варьироваться в зависимости от различных реализаций, поэтому вам просто нужно быть осторожным, как вы обращаетесь к элементам в массиве. Не считайте, что доступный на вашем компьютере элемент доступен на другом, если он не находится в пределах минимальных размеров, указанных в стандарте C++.

0

sizeof оценивается во время компиляции, единственный раз, когда SizeOf бы будет время выполнения оцененного бы в случае variable length arrays in C99 кода или в gcc или других C++ компиляторов, которые поддерживают VLA as an extension. Таким образом, этот код действителен:

char arr[sizeof(int)]; 

Хотя, если это локальная переменная, он не будет инициализирован.

Смежные вопросы