2012-02-23 33 views
39

thể trùng lặp:
Sizeof an array in the C programming language?
Why does a C-Array have a wrong sizeof() value when it's passed to a function?Làm thế nào để có được độ dài của một mảng trong C? Là "sizeof" một giải pháp?

Xem mã dưới đây và đề nghị với tôi rằng sự khác biệt của từ khóa "sizeof" là những gì khi tôi sử dụng như thế này:

#include<stdio.h> 
#include<conio.h> 
void show(int ar[]); 
void main() 
{ 
    int arr[]={1,2,3,4,5}; 
    clrscr(); 
    printf("Length: %d\n",sizeof(arr)); 
    printf("Length: %d\n",sizeof(arr)/sizeof(int)); 
    show(arr); 
    getch(); 
} 
void show(int ar[]) 
{ 
    printf("Length: %d", sizeof(ar)); 
    printf("Length: %d", sizeof(ar)/sizeof(int)); 
} 

Tuy nhiên, đầu ra là như thế này:

Output là:

Thời lượng: 10

Length: 5

Length: 2

Length: 1

lý do tại sao tôi nhận được như thế này; Nếu tôi muốn lấy toàn bộ dữ liệu từ một mảng này sang mảng khác thì tôi có thể làm như thế nào?

Đề xuất tôi Nếu có ai biết.

+1

Bạn không thể nhận được kích thước của một mảng trong C mà không có thêm thông tin. – m0skit0

+0

@Oli Charlesworth: Tôi đã tìm kiếm trên google nhưng tôi không nhận được liên kết mà bạn cung cấp; Cảm ơn bạn đã cung cấp; – alishaik786

+0

Bạn không thể nhận được kích thước của tham số mảng. –

Trả lời

60

Mảng phân rã thành con trỏ trong các cuộc gọi hàm. Không thể tính toán kích thước của một mảng chỉ được biểu diễn dưới dạng con trỏ theo bất kỳ cách nào, kể cả sử dụng sizeof.

Bạn phải thêm một tham số rõ ràng:

void show(int *data, size_t count); 

Trong cuộc gọi, bạn có thể sử dụng sizeof để tính số phần tử, đối với mảng thực tế:

int arr[] = { 1,2,3,4,5 }; 

show(arr, sizeof arr/sizeof *arr); 

Lưu ý rằng sizeof mang đến cho bạn kích thước theo đơn vị char, đó là lý do tại sao sự phân chia theo những gì cơ bản là sizeof (int) là cần thiết hoặc bạn sẽ nhận được một giá trị quá cao.

Cũng lưu ý, là điểm ưa thích và sạch sẽ, rằng sizeofkhông một chức năng. Dấu ngoặc đơn chỉ cần khi đối số là tên loại, vì đối số sau đó là biểu thức giống như diễn viên (ví dụ: sizeof (int)). Bạn thường có thể thoát ra mà không đặt tên các loại thực tế, bằng cách thực hiện sizeof trên dữ liệu thay thế.

+1

hiển thị (arr, sizeof arr/sizeof * arr); – Soran

+0

@Soran Cảm ơn, đã sửa! – unwind

+0

Trong khi tôi nghĩ rằng đây là giải pháp tổng quát tốt nhất - tức là truyền độ dài và mảng - tôi nghĩ cũng đáng lưu ý là đối với các mảng tĩnh (tức là chiều dài không thay đổi trong khi thực hiện chương trình), giải pháp đơn giản nhất là đặt kích thước mảng trong mã nguồn với định nghĩa tiền xử lý #define. Ví dụ. #define ARRAY_SIZE 5 – Bill

1

show() lấy địa chỉ của mảng được lưu trữ trên 2 byte. Hãy nghĩ về nó như int * ar.

2

Đó là lý do tại sao, khi viết một hàm nhận mảng, hai thông số được khai báo. một trong đó là một con trỏ đến mảng, cái kia xác định kích thước của mảng.

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