2009-12-14 36 views
26

Trong C, tôi có một mảng của cấu trúc được định nghĩa như sau:Kết quả của 'sizeof' trên mảng các cấu trúc trong C?

struct D 
{ 
    char *a; 
    char *b; 
    char *c; 
}; 

static struct D a[] = { 
    { 
     "1a", 
     "1b", 
     "1c" 
    }, 
    { 
     "2a", 
     "2b", 
     "2c" 
    } 
}; 

Tôi muốn xác định số phần tử trong mảng, nhưng sizeof(a) trả về một kết quả không chính xác: 48, chứ không phải 2. Tôi có làm điều gì đó sai, hoặc là sizeof đơn giản là không đáng tin cậy ở đây? Nếu vấn đề tôi biên soạn với GCC 4.4.

+0

Xem http://stackoverflow.com/questions/1598773/is-there-a-standard-function-in-c-that-would-return-the-length-of-an-array/1598827#1598827 cho một câu trả lời bao gồm một số hacks để làm cho các kỹ thuật được đăng dưới đây an toàn hơn. –

Trả lời

27
sizeof a/sizeof a[0]; 

Đây là một thời gian biên dịch liên tục, vì vậy bạn có thể sử dụng nó để, ví dụ, tạo mảng khác:

#define N sizeof a/sizeof a[0] 
int n_a[N]; 
+0

Trong trường hợp này, nếu sizeof (a) là 48, sizeof (a [0]) == 24. Điều đó làm cho mỗi char * chiếm 8 byte. sizeof (char *) có lẽ là 4 hoặc 8, tùy thuộc vào 32-bit/64-bit, nhưng trình biên dịch sẽ từ align cấu trúc thành viên, vì vậy mỗi phần tử kết thúc lên lấy 8 byte. – jmanning2k

+1

Vâng, nhưng điều tốt đẹp là, bộ phận đưa ra kích thước chính xác cho dù có đệm hay không, hoặc bất kỳ kích thước nào là kích thước của 'struct'. –

+0

#define không được có dấu chấm phẩy vào cuối – Paamand

37

sizeof mang đến cho bạn kích thước tính bằng byte, không phải là số nguyên tố. Như Alok nói, để có được số lượng các phần tử, chia kích thước theo byte của mảng theo kích thước tính theo byte của một phần tử. Thành ngữ C chính xác là:

sizeof a/sizeof a[0] 
+7

+1 để có giải thích tốt hơn. –

+10

Phiên bản thay thế, giống như thành ngữ là 'sizeof a/sizeof * a' – caf

7

sizeof trả về kích thước trong bộ nhớ của phần tử đã truyền. Bằng cách chia kích thước của một mảng theo kích thước phần tử đơn, bạn sẽ nhận được các phần tử đếm.

Lưu ý rằng kích thước phần tử cũng có thể bao gồm một số byte đệm. Vì lý do này, cấu trúc đệm (ví dụ: khi một thành viên char được theo sau bởi một con trỏ) sẽ có giá trị sizeof lớn hơn tổng kích thước thành viên.

Mặt khác, đừng để nó làm phiền bạn khi đếm các phần tử trong một mảng: sizeof(a)/sizeof(a[0]) vẫn hoạt động trơn tru như mong đợi.

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