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 *
。 因此, print
function接收指针值,而不是数组。 在函数参数声明的上下文中, 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()将返回字符串对象存储的字符数。