Làm cách nào để nhận được kích thước của mảng kiểu C một cách đáng tin cậy? Phương pháp thường được đề nghị có vẻ là để sử dụng sizeof
, nhưng nó không hoạt động trong foo
chức năng, nơi x
được thông qua tại:Cách nhận được kích thước đáng tin cậy của mảng kiểu C?
#include <iostream>
void foo(int x[]) {
std::cerr << (sizeof(x)/sizeof(int)); // 2
}
int main(){
int x[] = {1,2,3,4,5};
std::cerr << (sizeof(x)/sizeof(int)); // 5
foo(x);
return 0;
}
Câu trả lời cho this question khuyên bạn nên sizeof
nhưng họ không nói rằng nó (rõ ràng ?) không hoạt động nếu bạn truyền mảng xung quanh. Vì vậy, tôi có phải sử dụng một sentinel thay thế? (Tôi không nghĩ rằng người dùng của chức năng foo
của tôi luôn có thể được tin cậy để đặt một sentinel ở cuối. Tất nhiên, tôi có thể sử dụng std::vector
, nhưng sau đó tôi không nhận được cú pháp viết tắt tốt đẹp {1,2,3,4,5}
.)
http://stackoverflow.com/questions/1810083/c-pointers-pointing-to-an-array-of-fixed-size – AnT
Nếu người dùng chức năng của bạn không làm những gì các tài liệu bảo họ làm, đó là vấn đề của họ không phải của bạn. Nó là không thể ngăn chặn các clueless từ lạm dụng một API. –
'x' trong' foo' là một con trỏ, chứ không phải là một mảng. Xem http://stackoverflow.com/questions/232691/how-can-i-get-the-size-of-an-array-from-a-pointer-in-c, http://stackoverflow.com/questions/1975128/sizeof-an-array-in-the-c-ngôn ngữ lập trình. Ngoài ra, dup: http://stackoverflow.com/questions/37538/c-how-do-i-determine-the-size-of-my-array – outis