字符串字面量的大小

61
以下代码
#include <iostream>    
using namespace std;

int main()
{
    const char* const foo = "f";
    const char bar[] = "b";
    cout << "sizeof(string literal) = " << sizeof( "f" ) << endl;
    cout << "sizeof(const char* const) = " << sizeof( foo ) << endl;
    cout << "sizeof(const char[]) = " << sizeof( bar ) << endl;
}

输出

sizeof(string literal) = 2
sizeof(const char* const) = 4
sizeof(const char[]) = 2

在使用GCC编译的32位操作系统上。

  1. sizeof为什么会计算字符串字面量所需的空间(长度)?
  2. 当字符串字面量被传递给sizeof时,它是否具有与char*char[]不同的类型?
2个回答

136
  1. sizeof("f")必须返回2,一个为字母'f',一个为终止符'\0'。
  2. 在32位机器上,sizeof(foo)返回4,在64位机器上返回8,因为foo是一个指针。
  3. sizeof(bar)返回2,因为bar是一个包含两个字符('b'和终止符'\0')的数组。

字符串字面量的类型是“大小为N的const char数组”,其中N包括终止空字符。

请记住,当传递给sizeof时,数组不会退化为指针。


12
+1,但实际类型是“N个常量字符的数组”(const不可选)。 - David Rodríguez - dribeas
6
@dribeas:是的,我忽略了限定词,但你在追求严谨的正确性。 - Jonathan Leffler
14
@JonathanLeffler ...最好的正确性,特别是在编程方面。 - Alex Marshall
答案发表几分钟后就有关于“const”的评论,这让我感到非常开心。 - CplusPuzzle
对于第二点,如果我没记错的话,根据C标准,它不保证是4或8。但是,_精神_是正确的 - 它将是sizeof(const char *),无论该指针大小是多少,并且当然与字符串的实际长度无关。在某些平台/架构/编译器(历史上),指针大小和布局会根据类型而改变。这就是为什么,例如,在可变参数函数调用中,必须_显式地_将指针强制转换为其预期类型(如果它们不同),因为强制转换可能完全更改指针值。 - Qix - MONICA WAS MISTREATED
@AlexMarshall,我听说技术上正确是最好的正确。但我认为在这种情况下你是技术上正确的。我会更新我的_a posterioris._ - SO_fix_the_vote_sorting_bug

14

sizeof 返回其操作数所占的字节数。这应该可以回答问题1 ;) 当传递给 sizeof 时,字符串文字的类型是“数组到 n const char”。

逐个测试用例:

  • "f" 是一个字符串,由两个字符组成,即字符 f 和空字符结尾(NUL)。
  • foo 是一个指针(无论限定符如何),在您的系统上指针似乎有4个字节长。
  • 对于 bar 的情况与 "f" 相同。

希望这有所帮助。


为什么char[]和字符串字面值是一样的呢?虽然我不是C/C++专家,但我认为char[]char*是可以互换的吧? - Matthew Scharley
对于一般答案的加1(并且为了速度 :)),有几个澄清:foo是一个指针(基本上不适用限定符),在C++中类型始终为“n个const char的数组”(常量性不是可选的)。 - David Rodríguez - dribeas
@dribeas:你说得对,const总是适用的。@Matthew:char*和char[]只在某些情况下相同,sizeof运算符不是其中之一。 - Michael Foukarakis
2
@Matthew: 不对,数组和指针是不可互换的。数组可以在需要指针的地方传递,因为它会衰减为指针。但只要类型是数组,它就不是*指针。 - jalf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接