За исключением случаев, когда он является операндом операторов sizeof
или унарных &
или является строковым литералом, используемым для инициализации другого массива в объявлении, выражение массива будет неявно преобразовано в свой тип ("decay")из "N-элементного массива T" в "указатель на T", и его значением будет адрес первого элемента в массиве ( n1256 , 6.3.2.1/3).
Объект string
в main
представляет собой массив из 12 элементов char
.При вызове print
в main
тип выражения string
преобразуется из char [12]
в char *
.Поэтому функция print
получает значение указателя, а не массив.В контексте объявления параметров функции T a[]
и T a[N]
являются синонимами T *
;обратите внимание, что это only true для объявлений параметров функции (это одна из самых больших ошибок IMO в C).
Таким образом, функция print
работает с типом указателя, а не с типом массива, поэтому sizeof string
возвращает размер char *
, а не размер массива.