1
char * test = "test";
cout << sizeof(test);


char test2[] = "test";
cout << sizeof(test2);

在visual studio 2010上运行这个,为什么输出45
test 不应该是字符串文字,而sizeof字符串文字不应该是字符串文字中的字符元素数,包括终止的空字符?

4

4 回答 4

8

test指向字符串文字的指针,而不是字符串文字 (a char[]):

  • sizeof(char*)4test
  • sizeof(char[5])5test2[]

因此45是输出。

于 2013-05-15T14:24:21.623 回答
2

第一个显示指针的大小,而不是数组。在第二种情况下,您将显示数组的大小。

于 2013-05-15T14:24:24.480 回答
1

第一个test是指向 char 的指针。指针的大小取决于您的架构,但通常为 4 或 8 个字节。在您的情况下,它会导致“4”。请注意,将字符串文字分配给 achar*本质上是不安全的,您应该始终将其分配给char const*

第二个test2实际上是一个 5 个字符的数组。数组的大小是其元素的数量乘以它们的大小。在您的情况下,它会导致“5”。

总之,您会得到“45”的输出,因为您从不向输出流写入任何其他内容(如换行符)。

这是有道理的,一旦您意识到通过编写char test* = "test";您要求编译器将指向字符串的指针放在堆栈上的其他位置。你要求它char test2[] = "test";整个字符串的副本放在堆栈上——毕竟你的字符串中的每个字符都必须放在数组中。

如果您希望更改字符串,这一点尤其重要:如果禁止,则更改实际的字符串文字,因为它可能会在代码中的其他位置(由您自己或编译器)重用,这也是您应该始终使用的原因char const*引用字符串文字时。因此,您必须使用自己的字符串文字副本创建一个数组并对其进行更改。

于 2013-05-15T14:25:29.190 回答
1

在 32 位系统上,指针的大小是 32 位或 4 字节,因此 test 的大小是 4。另一方面,test2 是一个带有 NUL 终止字符的数组,它的大小是 5。

于 2013-05-15T14:46:24.510 回答