2013-06-03 28 views
11

Tại sao sizeof("Bill")5 nhưng sizeof(char)1?Tại sao kích thước byte của chuỗi dài hơn độ dài?

Điều đó không được làm cho sizeof("Bill")4 vì độ dài của chuỗi là 4 ký tự (4 x 1)?

Tôi tin rằng nó có thể có liên quan gì đó với "Bill" là một mảng các ký tự, nhưng tại sao lại tăng kích thước byte?

+4

@ H2CO3 - Tôi đồng tình - đây là chương trình C đơn giản mà thường được bao phủ trong vài lần đầu tiên của chương của một cuốn sách lập trình hợp lý về C (hoặc C++) –

+7

Đó là lý do không sử dụng câu hỏi này như là một nơi để viết một câu trả lời hợp lý và hy vọng cải thiện internet một chút. –

+2

@EdHeal Có thể một lá phiếu cho việc đóng cửa sẽ là một dấu hiệu tốt cho bạn đồng ý;) Tôi hoàn toàn đồng ý, câu hỏi này rất phù hợp với thuật ngữ "không có nỗ lực nghiên cứu" trong FAQ. –

Trả lời

22

Chuỗi C không được kết thúc. Có một số không byte ở cuối chuỗi đó. Giả sử ASCII, "Bill" trông như thế này trong bộ nhớ:

'B' 'i' 'l' 'l' '\0' 
0x42 0x69 0x6c 0x6c 0x00 

Từ tiêu chuẩn C, Mục 6.4.5 Chuỗi literals, đoạn 7:

Trong giai đoạn dịch 7, một byte hoặc mã của giá trị 0 được nối vào mỗi chuỗi ký tự nhiều byte kết quả từ chuỗi ký tự hoặc chữ.

Nếu bạn muốn nhận được một câu trả lời của 4 cho chiều dài, bạn nên sử dụng strlen("Bill"), chứ không phải là sizeof.

Nếu bạn thực sự không muốn người kết thúc vô giá trị, điều đó cũng có thể xảy ra, mặc dù có thể không được thông báo. Định nghĩa này:

char bill[4] = "Bill"; 

sẽ mang lại một mảng 4 byte bill chỉ chứa các ký tự 'B', 'i', 'l', và 'l', không có null-terminator.

3

nó có một 0 như một nhân vật terminator, vì vậy nó B i l l 0

Các vấn đề liên quan