2012-07-04 21 views
5

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); 
} 
+0

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ố. –

+0

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) –

Trả lời

10

Thành ngữ chỉ hoạt động cho các mảng được phân bổ tĩnh và chỉ trong phạm vi xác định chúng.

Nói cách khác, bạn có thể sử dụng nó cho các mảng như:

int foo[32]; 

... trong phạm vi trong đó chúng được xác định. Nhưng không phải ở nơi nào khác, và không cho các mảng đơn giản chỉ là con trỏ. Đối với các trường hợp khác, bạn sẽ cần truyền cùng thông tin bổ sung cho biết số lượng phần tử dự kiến ​​trong mảng.

+3

Vì vậy, một cái gì đó như 'int sắp xếp (int * arr, int kích thước)'? – BrewerHimself

+3

Exacly. Hoặc tốt hơn ngay cả 'size_t size' – wildplasser

+1

@BrewerHimself Yep, điều đó sẽ làm tốt :) Chỉ cần rõ ràng về việc' size' là kích thước của mảng theo byte hoặc số phần tử có chứa. – reuben

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