C ++简单sizeof char数组和char指针之间的区别

时间:2013-05-15 14:22:21

标签: c++ string sizeof

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


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

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

4 个答案:

答案 0 :(得分:8)

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

  • sizeof(char*)4,与test
  • 有关
  • sizeof(char[5])5,与test2[]
  • 有关

因此45是输出。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

总的来说,你得到一个“45”的输出,因为你从不在输出流中写任何其他内容(如换行符)。

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

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

答案 3 :(得分:1)

在32位系统上,指针的大小为32位或4个字节,因此,测试的大小为4.另一方面,test2是一个具有NUL终止字符的数组,其大小为5。