Sizeof не возвращает истинный размер переменной в C

Рассмотрим следующий код

#include  void print(char string[]){ printf("%s:%d\n",string,sizeof(string)); } int main(){ char string[] = "Hello World"; print(string); } 

и выход

 Hello World:4 

Так что же с этим?

Он возвращает истинный размер «переменной» (действительно, параметр функции). Проблема в том, что это не тот тип, который вы так думаете.

char string[] , как параметр для функции, эквивалентен char* string . Вы получаете результат 4 потому что это размер в вашей системе char* .

Подробнее читайте здесь: http://c-faq.com/aryptr/index.html

Это размер указателя char, а не длина строки.

Используйте strlen from string.h, чтобы получить длину строки.

string – указатель, а его размер равен 4. Вам нужно, вероятно, strlen .

массив изменится на указатель как параметр функции в ANSI C.

За исключением случаев, когда он является операндом операторов sizeof или унарных & или является строковым литералом, используемым для инициализации другого массива в объявлении, выражение массива будет иметь свой тип, неявно преобразованный («распад») из «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 * ; обратите внимание, что это верно только для объявлений параметров параметров (это одна из больших ошибок M).

Таким образом, функция print работает с типом указателя, а не с типом массива, поэтому sizeof string возвращает размер char * , а не размер массива.

Строка в c – это всего лишь массив символов. Это не обязательно завершается NUL (хотя в вашем случае это так). Функция не знает, как долго передается эта строка, она просто указала адрес строки как указатель.

«String» – это указатель и на вашем компьютере (32-разрядная машина) для хранения указателя требуется 4 байта. Поэтому sizeof (string) равен 4

Вы спрашивали системы для sizeof (адрес для начала массива символов), строка – это объект, чтобы получить информацию о его длине, вы должны спросить его через правильный интерфейс OO.

В случае std :: string функция-член string.length () возвращает число символов, хранящихся строковым объектом.

http://www.java2s.com/Code/Cpp/Data-Type/StringSizeOf.htm см. здесь, он имеет тот же результат, что и ваш … и найти, что ур делает неправильно