我将相同的字符串值分配给指针和char
数组
char *str = "hello" "world";
char str1[] = "hello" "world";
然后使用sizeof()
函数返回其长度
sizeof(str); // on my computer, it's 8 !!
sizeof(str1); // return 11, which is right
但是它们都可以通过%s
打印出来:
printf("%s\n%s\n", str, str1);
那么为什么sizeof(str);
会返回错误的值?
答案 0 :(得分:8)
那么为什么sizeof(str);返回错误的值?
它不会因为sizeof
返回其操作数类型的字节大小。来自 6.5.3.4 C99标准(草案n869)的sizeof运算符,第2节:
sizeof
运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或类型的带括号的名称。大小由操作数的类型确定。结果是整数。如果操作数的类型是可变长度数组类型,则计算操作数;否则,不评估操作数,结果是整数常量。
因此:
sizeof(str) == sizeof(char*)
sizeof(str1) == sizeof(char[11])
答案 1 :(得分:1)
第一个是指针。您不计算字符数,而是计算内存中指针的大小。你需要了解其中的差异。 char*
指向内存中您假定连续包含字符的位置。 char[x]
是内存中的一个位置,在那里有一行x个字符。
答案 2 :(得分:1)
值8是指针的大小,因为str实际上是指针,就像它看起来一样,即你可以重新指定它指向另一个字符串文字。
变量str1是一个字符数组,因此无法重新分配,其大小与数组的大小有关。
答案 3 :(得分:0)
第一个是指向char的指针,另一个是数组。 指针仅指向一个字符,大小为一个字节。
你可以使用char *作为数组,但你需要知道在单独的变量中计数。
答案 4 :(得分:0)
str*
是类型指针,str[]
是char [11]类型。因此,sizeof()
将返回不同的值,它返回类型的大小而不是字符串的长度。
您应该使用strlen()
来检查字符串的大小。请记住,使用strlen()
测试的每个字符串都必须以终止空值(\ 0)结尾。
对于常量(使用“lorem ipsum”在代码中定义),编译器会添加终止空值。
C编程语言本身对字符串的唯一支持是编译器会将带引号的字符串常量转换为以空字符结尾的字符串,该字符串存储在静态内存中。