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指针的大小,而不是字符串的长度。

使用string.h中的strlen来获取字符串长度。

string是一个指针,它的大小是4.你可能需要strlen

一个数组将变为指针作为ANSI C中函数的参数。

除非它是sizeof或一元&运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,否则数组表达式将从“N元素数组”中隐式转换(“衰减”)其类型T“到”指向T“的指针及其值将是数组中第一个元素的地址( n1256,6.3.2.1 /3)。

main对象 string是一个12元素的char数组。 在main print调用中, 表达式 string的类型从char [12]转换为char * 。 因此, printfunction接收指针值,而不是数组。 在函数参数声明的上下文中, T a[]T a[N]都是T *同义词; 请注意,这适用于函数参数声明(这是C的较大错误IMO之一)。

因此, print函数使用指针类型而不是数组类型,因此sizeof string返回char *的大小,而不是数组的大小。

c中的字符串只是一个字符数组。 它不一定是NUL终止的(尽管在你的情况下是这样)。 函数无法知道传递给它的字符串有多长 – 它只是将字符串的地址作为指针。

“String”是指针,在你的机器上(32位机器)需要4个字节来存储指针。 所以sizeof(string)是4

你向系统询问了sizeof(字符数组开头的地址),字符串是一个对象,要获得有关它的信息,你必须通过正确的OO接口询问它。

在std :: string的情况下,成员函数string.length()将返回字符串对象存储的字符数。