2014-09-15 2 views
0

Ниже приведен кодкакой размер arr [0]?

#include <stdio.h> 
int main() 
{ 
    double arr[0]; 
    double arr_one[1]; 
    printf("%d, %d",sizeof(arr[0]), sizeof(arr_one[1])); 

    return 0; 
} 

Результат:

8,8 

Я хочу знать, почему arr[0], arr_one[1] имеют одинаковый размер.

+3

Из-за UB .. – Maroun

+1

'обр [0],' обр [1], 'обр [1000]' - любой из тех, будет 'double', и, следовательно, одного и того же размера. Что вы ожидали? –

+2

'arr [0]' является незаконным, за исключением нескольких очень специальных контекстов (которые отличаются от C и C++). –

ответ

0

они одинаковы, потому что вы смотрите на размер первого элемента из двух массивов.

попробуйте sizeof(arr) и sizeof(arr_one), который представляет собой размер массива.

+0

Пожалуйста, не редактируйте вопрос, чтобы исправить код] (http://stackoverflow.com/review/spected-edits/5775012). – admdrew

5

Когда вы индексировать массив с [] типа является то, что из массива элемента, в этом случае double для обоих массивов. Без индексации (т. Е. sizeof(arr)) тип будет иметь тип массива.

+0

Обратите внимание, что в коде есть отдельная проблема с 'double arr [0]', являющейся массивом нулевого размера, но в компиляторах, где такой массив разрешен, тип _element массива все еще 'double' - следовательно,' ' sizeof' результат. 'sizeof' не получает доступ к элементу или не требует его существования (например,' sizeof (* nullptr) 'также разрешено). – Arkku

2

Вы даже не смотрите arr_one, а не arr действительно. Вы используете массив arr, чтобы получить размер его элементов (double), которые, конечно, одинаковы.

+0

Я предполагаю, что вы имеете в виду 'double', а не' char'. –

+1

opps, спасибо, исправлено –

2

Нулевые массивы не допускаются, поэтому код не должен компилироваться.

Если у вас есть компилятор, который принимает его как нестандартное расширение, то результат sizeof зависит только от типа выражения; в этом случае double. Выражение не оценивается (поэтому не имеет значения, связано ли это с наличием доступа к внешнему массиву или другим неопределенным поведением), и его тип тот же, независимо от того, имеет ли он определенное значение.

Если вы хотите задать размер массива, sizeof(arr), это будет зависеть от того, как компилятор решил иметь дело с нестандартными массивами нулевого размера. Будучи нестандартными, стандартная спецификация их размера не существует.

0

sizeof() double Тип 8, поэтому вы получаете 8,8. array arr[0] всегда ссылается как переменная с индексом двойного типа, а arry_one[1] также относится к значению типа double, поэтому выход 8,8.

1

Массив - это всего лишь кусок памяти, все элементы находятся позади друг друга.

Рассмотрим следующий массив голец, а затем удваивается:

char* text = "Hello World!"; 

char* begin = text; 
char* end = text + strlen(text) - 1; 

while(begin++ < end) 
    printf(*begin); 

Обратите внимание на char* begin = text или текст declartor сам по тому же вопросу. В printf вы разыскиваете указатель начала первого элемента *begin = *text = 'H'.

При объявлении массива всегда выделяется наименьшая часть, размер которой является типом.

Следующий может/будет равен char text[0], но затем подлежит компиляции.

char* text = ""; 
Смежные вопросы