2009-09-08 72 views
39

以下代碼的sizeof字符串文字

#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 
上的32位操作系統

,使用GCC編譯。

  1. 爲什麼sizeof計算字符串文字的長度(需要的空間)?
  2. 當給sizeof時,字符串文字是否有不同的類型(來自char *或char [])?

回答

89
  1. sizeof("f")必須返回2,一個用於'f',一個用於終止'\ 0'。
  2. sizeof(foo)在64位機器上的32位機器和8上返回4,因爲foo是一個指針
  3. sizeof(bar)返回2,因爲杆是兩個字符,則「B」和終止「\陣列0 」。

字符串文字的類型是'char大小爲N的數組',其中N包含終端null。

請記住,當傳遞給sizeof時,數組不會衰減到指針。

+9

+1,但該類型實際上是'N個常量字符數組'(const不是可選的) – 2009-09-08 06:02:13

+4

@dribeas:yes;我忽略了預選賽,但你的文理正確。 – 2009-09-08 06:13:58

+11

@JonathanLeffler ......最好的一種正確,特別是在編程方面 – 2014-05-01 22:12:23

11

sizeof返回其操作數的字節大小。這應該回答問題編號1.;)此外,字符串文字的類型是「數組到n常量字符」傳遞到sizeof

你的測試用例,逐一:

  • "f"是由 兩個字符,字符f和終止 NULL文字的字符串。
  • foo是一個指針(編輯:無論限定符),和指針似乎是4個字節長在系統上..
  • 對於bar的情況下是一樣的"f"

希望有幫助。

+0

爲什麼'char []'和striong文字一樣?我不是C/C++專家,但我認爲'char []'和'char *'可以互換? – 2009-09-08 05:58:05

+0

+1對一般答案(和速度:)一些精度:foo是一個指針(本質上不適用限定符),在C++中,類型始終是「n常量字符數組」(constant-ness不是可選的) – 2009-09-08 06:01:25

+0

@dribeas:對,const,總是適用。 @Matthew:char *和char []在某些情況下是相同的,sizeof運算符不是其中之一。 – 2009-09-08 06:09:37