2011-09-09 20 views
6

xem xét đoạn mã sau:sizeof() áp dụng cho cấu trúc và biến

struct foo { 
    int a; 
    int b; 
    int c; 
}; 

struct foo f; 
printf("%u, %u\n", sizeof(struct foo), sizeof(f)); 

Mã này trả về giá trị như nhau, nhưng tôi đã tự hỏi nếu sizeof() áp dụng cho biến là đúng hay đây chỉ là trùng hợp ngẫu nhiên?

Cảm ơn.

+0

Bạn đã thử Googling "sizeof áp dụng cho biến" chưa? Hai kết quả đầu tiên (một trong số đó là từ StackOverflow) sẽ có thể trả lời câu hỏi của bạn. –

+0

Có, cả hai biểu thức 'sizeof' đều trả về cùng một giá trị. Lưu ý rằng thứ hai không yêu cầu dấu ngoặc đơn; 'sizeof' là toán tử, không phải là hàm. Nhưng '% u' yêu cầu một đối số kiểu' unsigned int', không phải 'size_t'. Viết này: 'printf ("% zu% zu \ n ", sizeof (struct foo), sizeof f);' hoặc this: 'printf ("% lu% lu \ n ", (unsigned long) sizeof (struct foo) , (unsigned long) sizeof f); '. '% zu' là một tính năng cụ thể của C99; di chuyển 'printf' của hệ thống không hỗ trợ nó. –

Trả lời

6

Cả hai sẽ và thực sự phải trả lại cùng một giá trị.

Từ MSDN:

Các sizeof hành
Nhà điều hành sizeof cho lượng lưu trữ, tính bằng byte, cần thiết để lưu trữ một đối tượng của loại toán hạng. Toán tử này cho phép bạn tránh chỉ định kích thước dữ liệu phụ thuộc vào máy trong các chương trình của bạn.

sizeof unary-expression 
sizeof (type-name) 
1

Điều này đúng như dự kiến, nghĩa là cả hai sẽ trả về cùng một giá trị. Giá trị này được tính tại thời gian biên dịch.

Thực tiễn tốt nhất là sử dụng biến trong sizeof vì sau này bạn có thể thay đổi loại và do đó kích thước cũng có thể thay đổi.

0

Nói chung, bạn nên áp dụng nó vào biến. Sau đó nó sẽ vẫn chính xác nếu loại biến thay đổi.

+0

Những bất lợi của cách này là nếu bạn thay đổi loại biến từ "chỉ struct" thành "pointer to struct", thì sizeof (biến) sẽ trở thành 4 (hoặc 8 tùy thuộc vào kiến ​​trúc) và trình biên dịch sẽ vui vẻ chấp nhận nó mà không nói bạn cảnh báo. – ivanzoid

5

sizeof hoạt động với các loạibiểu thức. Khi bạn áp dụng nó cho một loại, số () là một phần của cú pháp sizeof: sizeof(type). Khi bạn áp dụng nó cho một biểu thức () không phải là một phần của cú pháp sizeof: sizeof expression.

Vì vậy, sizeof thứ hai của bạn không thực sự "được áp dụng cho biến". Nó được áp dụng cho một biểu thức (f). Biểu thức đó bao gồm một biến đơn f được đính kèm thành cặp dự phòng là (). Bạn cũng có thể thực hiện mà không cần cặp dự phòng () và chỉ sử dụng sizeof f.

Khi sizeof được áp dụng cho một biểu thức, nó trả về kích thước của kết quả biểu thức (nghĩa là kích thước của loại biểu thức có). Trong ví dụ của bạn, cả hai ứng dụng của sizeof đều được đảm bảo để đánh giá cùng một giá trị.

Thực tế, thực hành lập trình tốt là tránh nhiều nhất có thể, ví dụ: thích sử dụng sizeof expression. Điều này làm cho mã của bạn độc lập hơn, luôn là điều tốt. Loại tên thuộc về khai báo và không nơi nào khác.

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