2012-07-04 7 views
5

Estoy trabajando en una ordenación de inserción y mi matriz en main() parece que solo se pasa parcialmente a sort(). El siguiente fragmento muestra que test en main() tiene el valor {2, 1, 3, 1, 2}, pero arr en sort() tiene el valor {2, 1}. ¿Que está pasando aqui?No se aprobó la matriz completa en 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

La lección para aprender de esto es pasar el tamaño de la matriz a la función que está llamando. No intente hacer que la función determine el tamaño de la matriz. En general, la función no puede determinar el tamaño. En algunos casos especiales seleccionados, es posible (por ejemplo, hay un puntero nulo al final de una matriz de punteros). No es un accidente que la lista de argumentos para 'main()' sea 'int main (int argc, char ** argv)', aunque ese es uno de los casos especiales donde el puntero nulo puede usarse para determinar el final de la lista de argumentos. –

+0

posible duplicado de [Cómo encontrar el tamaño de (un puntero apuntando a una matriz)] (http://stackoverflow.com/questions/492384/how-to-find-the-sizeofa-pointer-pointing-to-an- array) –

Respuesta

10

El idioma sizeof(arr)/sizeof(int) sólo funciona para las matrices asignadas estáticamente, y sólo dentro del ámbito que las define.

En otras palabras, se puede usar para arreglos como:

int foo[32]; 

... en el ámbito en el que están definidas. Pero no en otro lugar, y no para arreglos simplemente pasó como punteros. Para otros casos, deberá pasar información adicional que indique la cantidad esperada de elementos en la matriz.

+3

¿Algo así como 'int sort (int * arr, int size)'? – BrewerHimself

+3

Exactamente. O mejor aún 'size_t size' – wildplasser

+1

@BrewerHimself Sí, eso sería perfecto :) Solo aclare si' size' es el tamaño de la matriz en bytes o la cantidad de elementos contenidos. – reuben

Cuestiones relacionadas