Lors du passage d'un pointeur ou d'un tableau à une fonction en C, c'est en fait une copie de la valeur du pointeur (c'est-à-dire l'adresse mémoire) qui est passée, et non le tableau lui-même ou le contenu de la mémoire. Historiquement, les tableaux en C ne sont pas passés par valeur — au lieu de cela, un pointeur vers le premier élément du tableau est passé à la fonction. Ce mécanisme économise de la mémoire, mais peut engendrer des effets secondaires indésirables en cas de mauvaise utilisation.
Problème — confusion entre pointeurs et tableaux : les développeurs pensent souvent qu'à l'intérieur de la fonction, il est impossible de modifier le tableau externe ou que la fonction connaît automatiquement la taille du tableau passé. Dans la pratique, la fonction perd la taille initiale du tableau et peut facilement dépasser ses limites.
Solution — toujours passer explicitement la taille du tableau comme argument séparé, comprendre clairement la différence entre la copie d'un pointeur et la copie d'un objet, ne pas oublier que toute modification par le pointeur affecte les données d'origine.
Exemple de passage correct d'un tableau :
void print_array(const int* arr, size_t size) { for (size_t i = 0; i < size; ++i) printf("%d ", arr[i]); } int main() { int nums[] = {1,2,3,4,5}; print_array(nums, sizeof(nums)/sizeof(nums[0])); return 0; }
Caractéristiques clés :
Une fonction peut-elle connaître la longueur du tableau passé si celui-ci a été déclaré comme int arr[10]?
Réponse : Non, à l'intérieur de la fonction, l'expression sizeof(arr) renverra la taille du pointeur, et non celle du tableau entier. La taille doit être passée séparément.
Passer un tableau comme int arr[] et comme int arr dans les fonctions est-ce la même chose ?*
Réponse : Oui, dans la signature de la fonction, c'est équivalent — dans les deux cas, un pointeur vers int est passé. Les différences se situent uniquement au niveau de la syntaxe.
En modifiant les éléments d'un tableau à l'intérieur de la fonction, le tableau d'origine sera-t-il modifié ?
Réponse : Oui, puisque c'est un pointeur qui est passé, la fonction modifie la mémoire qu'il pointe.
Le projet a implémenté une fonction d'initialisation des tableaux, déterminant la taille à l'intérieur de la fonction en utilisant sizeof(arr) / sizeof(arr[0]). Lors des tests, la fonction fonctionnait, mais en traitant d'autres tableaux — elle écrasait la mémoire d'autres utilisateurs ou ne fonctionnait pas correctement.
Avantages :
Inconvénients :
La fonction prenait toujours la taille du tableau comme paramètre séparé, la longueur étant calculée par la partie appelante. À l'intérieur de la fonction, seules les paramètres passés étaient utilisés.
Avantages :
Inconvénients :