2012-07-04 2 views
5

Je travaille sur un tri d'insertion et mon tableau dans main() ne semble être que partiellement transmis à sort(). L'extrait ci-dessous montre que test dans main() a la valeur {2, 1, 3, 1, 2}, mais arr dans sort() a la valeur {2, 1}. Que se passe t-il ici?Le tableau complet n'est pas transmis 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 leçon à tirer de ceci est de passer la taille de la matrice à la fonction que vous appelez. N'essayez pas de faire en sorte que la fonction détermine la taille du tableau. En général, la fonction ne peut pas déterminer la taille. Dans certains cas particuliers, c'est possible (par exemple, il y a un pointeur nul à la fin d'un tableau de pointeurs). Ce n'est pas un accident que la liste des arguments de 'main()' soit 'int main (int argc, char ** argv)', même si c'est l'un des cas spéciaux où le pointeur nul peut être utilisé pour déterminer la fin de la liste des arguments. –

+0

duplication possible de [Comment trouver le sizeof (un pointeur pointant vers un tableau)] (http://stackoverflow.com/questions/492384/how-to-find-the-sizeofa-pointer-pointing-to-an- array) –

Répondre

10

L'idiome sizeof(arr)/sizeof(int) ne fonctionne que pour les tableaux alloués statiquement, et que dans le cadre qui les définit.

En d'autres termes, vous pouvez l'utiliser pour les tableaux comme:

int foo[32]; 

... dans le cadre dans lequel elles sont définies. Mais pas ailleurs, et pas pour les tableaux simplement passés comme des pointeurs. Pour les autres cas, vous devrez transmettre des informations supplémentaires indiquant le nombre attendu d'éléments dans le tableau.

+3

Donc, quelque chose comme 'int sort (int * arr, int taille)'? – BrewerHimself

+3

Exacly. Ou mieux encore size_t size – wildplasser

+1

@BrewerHimself Yep, ça irait très bien :) Sachez juste si 'size' est la taille du tableau en octets ou en nombre d'éléments contenus. – reuben

Questions connexes