2013-06-23 43 views
16

Tôi có một đoạn mã C và tôi không hiểu làm thế nào sizeof(...) chức năng hoạt động:kích thước của mảng và kích thước của con trỏ nhân vật nhân vật

#include <stdio.h> 

int main(){ 
    const char firstname[] = "bobby"; 
    const char* lastname = "eraserhead"; 
    printf("%lu\n", sizeof(firstname) + sizeof(lastname)); 
    return 0; 
} 

Trong sizeof mã trên (firstname) là 6 và sizeof (họ) là 8.

Nhưng bobby có chiều rộng là 5 ký tự và eraserhead rộng 11. Tôi mong đợi 16.

Tại sao sizeof hoạt động khác với mảng ký tự và con trỏ đến ký tự?

Có ai có thể làm rõ?

+5

Cả hai 'sizeof' và' strlen() 'cho kết quả của kiểu' size_t'. Sử dụng '% zu', không phải'% lu' để in các giá trị 'size_t'. Hoặc, nếu trình biên dịch của bạn không hỗ trợ '% zu', hãy chuyển đổi thành một loại đã biết và sử dụng định dạng thích hợp cho loại đó. –

Trả lời

23

firstname là một char mảng có dấu sau 0 -terminator. lastname là một con trỏ. Trên một con trỏ hệ thống 64bit rộng 8 byte.

+0

Vâng rõ ràng là OP đã cố gắng tìm ra kích thước của chuỗi chuỗi có độ dài chuỗi và thêm cả hai trong số họ khi anh ta nói '" tại sao không 5 + 10 = 15? "', Có thực sự có thể nhận được chiều dài chuỗi qua 'sizeof' hoặc' strlen() 'là phù hợp hơn? bạn nói gì? – 0decimal0

+2

@PHIfounder: Như ** một "chuỗi" trong C được biểu diễn bằng một chuỗi ký tự được kết thúc bằng ký tự ''\ 0'' **, sử dụng' strlen() 'để có độ dài" chuỗi ". Điều này hoạt động trên các mảng ký tự "thực", cũng như trên con trỏ trỏ đến phần sau. Trong bối cảnh này, nó không có tầm quan trọng hàng đầu về cách thức và vị trí các ký tự được lưu trữ. Trong thực tế, biến giữ chuỗi không nhất thiết phải khớp với độ dài của chuỗi ký tự. Nếu mặt khác, nó quan tâm đến ** số byte mà một biến được khai báo để sử dụng **, sử dụng toán tử 'sizeof'. – alk

+2

Và số byte cần lưu trữ một chuỗi 's' (hoặc được trỏ đến bởi' s') là 'strlen (s) + 1'. –

3

Kích thước mảng đầu tiên của bạn có kích thước là bobby\0. \0 là ký tự terminator, do đó, nó là 6.

Kích thước thứ hai là kích thước của một con trỏ, là 8 byte trong hệ thống 64 bit của bạn. Kích thước của nó không phụ thuộc vào độ dài của chuỗi được chỉ định.

6

sizeof một mảng là kích thước của tổng mảng, trong trường hợp của "bobby", đó là 5 ký tự và một trailing \0 đó bằng 6.

sizeof một con trỏ là kích thước của con trỏ, đó là bình thường 4 byte trong máy 32 bit và 8 byte trong máy 64 bit.

2

firstname[] không được chấm dứt, làm tăng thêm 1 đến độ dài.

sizeof(lastname) cho kích thước của con trỏ thay vì giá trị thực.

+3

'* lastname' là một' char' duy nhất, vì vậy 'sizeof * lastname' sẽ luôn là 1. – caf

2

firstname là một mảng gồm 6 chars, bao gồm ký tự kết thúc '\0' ở cuối chuỗi. Đó là lý do tại sao sizeof firstname là 6.

lastname là con trỏ đến char và sẽ có bất kỳ kích thước con trỏ nào trên hệ thống của bạn. Các giá trị điển hình là 4 và 8. Kích thước của lastname sẽ giống nhau bất kể nó trỏ đến (hoặc thậm chí nếu nó trỏ đến không có gì cả).

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