2012-07-04 2 views
5

Я работаю над сортировкой вставки, и мой массив в main(), кажется, частично передан в sort(). В приведенном ниже фрагменте показано, что test в main() имеет значение {2, 1, 3, 1, 2}, но arr в sort() имеет значение {2, 1}. Что тут происходит?Полный массив не передается в 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

Урок, чтобы узнать из этого, состоит в том, чтобы передать размер массива функции, которую вы вызываете. Не пытайтесь заставить функцию определять размер массива. В общем случае функция не может определить размер. В некоторых отдельных случаях это возможно (например, есть нулевой указатель в конце массива указателей). Не случайно, что список аргументов для 'main()' is 'int main (int argc, char ** argv)', хотя это один из особых случаев, когда нулевой указатель можно использовать для определения конца списка аргументов. –

+0

Возможный дубликат [Как найти sizeof (указатель, указывающий на массив)] (http://stackoverflow.com/questions/492384/how-to-find-the-sizeofa-pointer-pointing-to-an- array) –

ответ

10

Идиом sizeof(arr)/sizeof(int) работает только для статический распределенных массивов, и только в пределах объема, который определяет их.

Другими словами, вы можете использовать его для массивов, таких как:

int foo[32]; 

... в объеме, в котором они определены. Но не в другом месте, а не для массивов, просто передавались как указатели. В других случаях вам потребуется передать дополнительную информацию, указывающую ожидаемое количество элементов в массиве.

+3

Так что-то вроде 'int sort (int * arr, int size)'? – BrewerHimself

+3

Exacly. Или лучше даже 'size_t size' – wildplasser

+1

@BrewerHimself Да, это будет просто отлично :) Просто уточните, является ли размер' size' размером массива в байтах или количеством содержащихся элементов. – reuben