2009-09-08 36 views
39

Các mã sau đâysizeof chuỗi chữ

#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; 
} 

đầu ra

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

trên một hệ điều hành 32bit, biên soạn với GCC.

  1. Tại sao sizeof tính toán độ dài (không gian cần thiết) chuỗi chữ?
  2. Chuỗi chữ có loại khác (từ char * hoặc char []) khi được gán cho sizeof?

Trả lời

89
  1. sizeof("f") phải trả về 2, một cho 'f' và một cho chấm dứt '\ 0'.
  2. sizeof(foo) lợi nhuận 4 trên một máy 32-bit và 8 trên một máy 64-bit vì foo là một con trỏ
  3. sizeof(bar) returns 2 vì thanh là một mảng của hai nhân vật, các 'b' và chấm dứt '\ 0 '.

Chuỗi ký tự có loại 'mảng có kích thước N của char' trong đó N bao gồm giá trị null của thiết bị đầu cuối.

Hãy nhớ rằng, mảng không phân rã thành con trỏ khi được chuyển đến sizeof.

+9

+1, nhưng loại thực sự là 'mảng của các ký tự const' (const không phải là tùy chọn) –

+4

@dribeas: yes; Tôi đã bỏ qua các vòng loại, nhưng bạn là chính xác về mặt đạo đức. –

+11

@JonathanLeffler ... loại tốt nhất của chính xác, đặc biệt là khi nói đến lập trình –

11

sizeof trả về kích thước tính theo byte của toán hạng. Điều đó sẽ trả lời câu hỏi số 1.;) Ngoài ra, một chuỗi chữ là loại "mảng để n const char" khi được chuyển đến sizeof.

trường hợp của bạn thử nghiệm, từng người một:

  • "f" là một chuỗi chữ gồm hai nhân vật, nhân vật f và chấm dứt NULL.
  • foo là một con trỏ (chỉnh sửa: không phụ thuộc vòng loại), và con trỏ có vẻ phải dài 4 byte trên hệ thống của bạn ..
  • Đối bar trường hợp cũng giống như "f".

Hy vọng điều đó sẽ hữu ích.

+0

Tại sao chữ 'char []' giống như chữ in đậm? Tôi không phải là chuyên gia C/C++, nhưng tôi nghĩ rằng 'char []' và 'char *' có thể hoán đổi cho nhau? –

+0

+1 trên câu trả lời chung (và cho tốc độ :) Một vài điểm: foo IS con trỏ (về cơ bản vòng loại không áp dụng) và trong C++ kiểu luôn luôn là "mảng của n const char" (hằng số-ness không phải là tùy chọn) –

+0

@dribeas: đúng là bạn, const luôn áp dụng. @Matthew: char * và char [] chỉ giống nhau trong một số trường hợp, toán tử sizeof không phải là một trong số chúng. –