Tôi đang làm việc trên sắp xếp chèn và mảng của tôi trong main() dường như chỉ được chuyển một phần tới sắp xếp(). Đoạn mã dưới đây cho thấy rằng test
trong chính() có giá trị {2, 1, 3, 1, 2}
, nhưng arr
theo loại() có giá trị {2, 1}
. Những gì đang xảy ra ở đây?Toàn bộ mảng không được chuyển qua trong C
#include <stdio.h>
int sort(int* arr) {
int i = 0;
int j, key;
int count = 0;
printf("Inside sort(): ");
for (j = 0; j < sizeof(arr)/sizeof(int); ++j)
printf("%d ", arr[j]);
printf("\n");
for (j = 1; i < sizeof(arr)/sizeof(int); ++j) {
key = arr[j];
i = j - 1;
while (i >= 0 && arr[i] > key) {
arr[i + 1] = arr[i];
--i;
++count;
}
arr[i + 1] = key;
}
return count;
}
int main(int argc, char* argv) {
int test[] = {2, 1, 3, 1, 2};
int i = 0;
printf("Inside main(): ");
for (i = 0; i < sizeof(test)/sizeof(int); ++i)
printf("%d ", test[i]);
printf("\n");
int count = sort(test);
}
Bài học để học hỏi từ điều này là chuyển kích thước của mảng tới hàm bạn đang gọi. Đừng cố gắng làm cho hàm xác định kích thước của mảng. Nói chung, hàm không thể xác định kích thước. Trong một vài trường hợp đặc biệt được chọn, có thể (ví dụ, có một con trỏ null ở cuối của một mảng con trỏ). Nó không phải là một tai nạn mà danh sách đối số cho 'main()' là 'int main (int argc, char ** argv)', mặc dù đó là một trong những trường hợp đặc biệt mà con trỏ null có thể được sử dụng để xác định kết thúc của danh sách các đối số. –
có thể trùng lặp của [Làm thế nào để tìm sizeof (một con trỏ trỏ đến một mảng)] (http://stackoverflow.com/questions/492384/how-to-find-the-sizeofa-pointer-pointing-to-an- array) –