2

我将相同的字符串值分配给指针和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);返回错误的值呢?

4

5 回答 5

8

那么为什么 sizeof(str);return 一个错误的值呢?

它不是因为sizeof返回其操作数类型的字节大小。从第6.5.3.4 节 C99 标准的 sizeof 运算符(草案 n869)第 2 节:

运算符产生其sizeof操作数的大小(以字节为单位),它可以是表达式或带括号的类型名称。大小由操作数的类型决定。结果是一个整数。如果操作数的类型是变长数组类型,则计算操作数;否则,不计算操作数,结果是一个整数常量。

所以:

sizeof(str)  == sizeof(char*)
sizeof(str1) == sizeof(char[11])
于 2013-07-05T08:29:30.967 回答
1

值 8 是指针的大小,因为 str 实际上是一个指针,就像它看起来一样,即您可以重新分配它以指向另一个字符串文字。

变量 str1 是一个字符数组,因此不能重新分配,它的大小与数组的大小有关。

于 2013-07-05T08:33:50.627 回答
1

第一个是指针。您不计算字符数,而是计算内存中指针的大小。您需要了解其中的区别。char*指向您假设在一行中包含字符的内存位置。char[x]是内存中的一个位置,那里有 x 个字符。

于 2013-07-05T08:28:39.420 回答
0

第一个是指向char的指针,另一个是数组。指针只指向一个字符,大小是一个字节。

您可以将 char* 用于数组,但您需要知道单独变量中的计数。

于 2013-07-05T08:28:48.333 回答
0

str*是指针类型,str[]是 char[11] 类型。因此,您sizeof()将返回不同的值,它返回类型的大小而不是字符串的长度。

您应该使用strlen()来检查字符串的大小。请记住,您测试的每个字符串都strlen()必须以终止 null (\0) 结尾。

对于常量(使用“lorem ipsum”在代码中定义)终止的 null 由编译器添加。

C 编程语言本身对字符串的唯一支持是编译器会将带引号的字符串常量转换为以 null 结尾的字符串,该字符串存储在静态内存中。

https://en.wikipedia.org/wiki/C_string_handling

于 2013-07-05T08:34:51.990 回答