То, что вы получите, на самом деле и ожидается. С
int *pnarr;
sizeof (pnarr);
вы получаете размер указателя int*
, то есть адреса (обычно 4 или 8 байт в зависимости от архитектуры вашей системы). Вы получите его по любому адресу, который вам назначен.
Функция arr_len ()
, которую вы разместили в вопросе, не найдет длину массива, потому что она ошибочно полагает, что последний элемент равен 0. Это обычно не соответствует действительности.
Это делается вместо этого с strings (массив символов), которые на самом деле являются символами, оканчивающимися на 0. Но в этом случае это стандарт, и вы уверены, что строка не будет содержать нулей в середине.
В заключение, если вам нужен общий размер в байтах массива, вы можете получить его из исходного имени массива с помощью
sizeof(narr)
Если вам нужно количество элементов массива, просто используйте
sizeof(narr)/sizeof(narr [0])
Так что вы не можете сделать это с указателем, но вам нужен исходный массив "reference" .