2010-05-05 42 views
24

Cách tìm kích thước của một dãy số nguyên trong C.Cách tìm kích thước của dãy số nguyên

Bất kỳ phương pháp nào có sẵn mà không đi qua toàn bộ mảng một lần, để tìm kích thước của mảng.

+14

Làm thế nào mà bạn thực hiện mảng này? Về nguyên tắc, bạn có biết kích thước mảng trong O (1) (kích thước đã biết), O (N) (không kết thúc), hoặc không thể. – kennytm

+0

Thông thường mảng được tạo dưới dạng biến tĩnh và bạn phải vượt qua một số độ dài trong khi tạo. – Jack

+1

@Jack: Tại sao mảng "thường" là tĩnh ??? – sbi

Trả lời

72

Nếu mảng là biến toàn cục, tĩnh hoặc tự động (int array[10];), thì sizeof(array)/sizeof(array[0]) sẽ hoạt động.

Nếu đó là mảng được phân bổ động (int* array = malloc(sizeof(int)*10);) hoặc được chuyển làm đối số hàm (void f(int array[])), thì bạn không thể tìm thấy kích thước của nó tại thời gian chạy. Bạn sẽ phải lưu trữ kích thước ở đâu đó.
Lưu ý rằng sizeof(array)/sizeof(array[0]) chỉ biên dịch ngay cả đối với trường hợp thứ hai, nhưng âm thầm sẽ tạo ra kết quả sai.

+0

Có lẽ đề cập đến và chỉ ra một câu hỏi giải thích sự phân rã mảng? Chủ đề thường xuyên –

+1

Đối với những người mới sử dụng C++ đến câu hỏi C này: [Mọi thứ bạn từng muốn biết về mảng trong C++] (http://stackoverflow.com/q/4810664/140719) trong một câu hỏi thường gặp. – sbi

+0

http://stackoverflow.com/questions/5493281/c-sizeof-a-passed-array – delive

-1
int len=sizeof(array)/sizeof(int); 

Nên hoạt động.

+2

Không - trong nhiều trường hợp, thao tác này sẽ không hoạt động. –

+2

Nó hoạt động, tuy nhiên 'site_t len ​​= sizeof (mảng)/sizeof (mảng [0]);' nó tốt hơn một chút (tức là nó vẫn hoạt động khi kiểu dữ liệu của các phần tử mảng đã được thay đổi. –

+4

@Grzegorz: Cho chúng ta thấy nó hoạt động như thế nào cho mảng này: 'void f (int mảng []) {site_t len ​​= sizeof (mảng)/sizeof (mảng [0]);}' – sbi

4

Nếu mảng được tĩnh phân bổ:

size_t size = sizeof(arr)/sizeof(int); 

nếu mảng là động phân bổ (đống):

int *arr = malloc(sizeof(int) * size); 

trong đó kích thước biến là một chiều hướng của arr.

3

_msize(array) trong Windows hoặc malloc_usable_size(array) trong Linux nên làm việc cho mảng động

Cả hai đều nằm trong phạm vi malloc.h và cả hai trở về một size_t

+1

Chúng hữu ích, nhưng không phải là rất xách tay ... – glglgl

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