2016-12-13 3 views
-2
char *myArray[] = { "aaaaaa", "ccccc", "bbbbbb", "111111" }; 

printf("%d\n", sizeof(myArray)); 

printf("%d\n", (int)(&myArray + 1) - (int)(&myArray)); 

Мой вопрос в том, почему передача myArray в sizeof может получить тот же результат, что и второй метод.C размер массива байтов размер

Я знаю, что myArray представляет адрес, который указывает на первый из четырех адресов внутреннего пространства, но как sizeof распознает размер байтов 4 int пространство?

sizeof не является функцией, что это такое?

+1

[SizeOf ] (https://en.wikipedia.org/wiki/Sizeof) является унарным оператором. –

+2

"* Я знаю, что myArray представляет адрес, который указывает на первый ... *« Не когда передается 'sizeof'. – juanchopanza

+1

'printf ("% d \ n ", sizeof (myArray));' -> 'printf ("% zu \ n ", sizeof (myArray));' – LPs

ответ

3

почему передача myArray в sizeof может получить тот же результат, что и второй метод.

char *myArray[] = { "aaaaaa", "ccccc", "bbbbbb", "111111" }; 

myArray является массив из 4 указателей на char. Итак, sizeof(myArray) = 4*sizeof(pointer_to_char). Обычно в 64-битной машине sizeof(pointer) - это 64-разрядная (8 байтов), и поэтому она составляет 32 байта.

Что касается второго Printf

printf("%d\n", (int)(&myArray + 1) - (int)(&myArray)); 

Поскольку myArray является массивом, то &myArray является указателем на массив. Здесь (&myArray + 1) указывает на следующий массив указателей. Подумайте об этом как о следующем блоке из 4 указателей на символ. И так (&myArray + 1) - (&myArray) такой же, как размер исходного массива указателей.


Btw, вы должны использовать соответствующую строку printf управления:

  • Для sizeof используйте %zu:

    Е ("% цу \ п", SizeOf (туАггау));

  • Вашей 2-PRINTF работы, но будет давать предупреждения о бросании в целое:

    warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]

Это предупреждение можно избавиться от:

char *p_start = (char *)(&myArray + 1); 
char *p_end = (char *)(&myArray); 
printf("%td", p_start - p_end); 
3

sizeof(myArray) дает вам размер массива из 4 указателей символов, возможно 4x4 = 16. sizeof - оператор, который в большинстве случаев оценивается во время компиляции. Он определяется языком для выполнения этой задачи - язык говорит, что работа sizeof заключается в том, чтобы знать размер вещей, так вот как он это знает.

&myArray дает вам указатель на массив типа char (*)[4]. &myArray+1 делает арифметику на таком массиве, указывая адрес указателя массива, указывающий только на массив 4x4. Если вы вычтите этот адрес с исходным адресом, вы получите размер массива в байтах.

Нет никакой реальной разницы между этими двумя формами, кроме sizeof, настолько читабельнее.


(В качестве примечания, результатов второго версия в типе называется ptrdiff_t, и если вы хотите, чтобы напечатать это с Printf, вы должны использовать% tử спецификатор формата.)

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