Problème de longueur de tableau

Je lisais un document de placement csc où je lisais une question relative à l’opérateur sizeof () du tableau de langage c. La réponse était autre chose que ce à quoi je m’attendais.

int DIMension(int array[]) { return sizeof(array )/ sizeof(int); } main() { int arr[10]; printf(“Array dimension is %d”, DIMension(arr)); } 

Ce programme en langage c affiche 1 comme réponse. Pourquoi est-ce que ça se passe?

Parce que int array[] est juste un pointeur et que sa taille est la même que celle de int . Je pense que vous vous attendiez à ce que la taille de l’ arr soit utilisée d’une manière ou d’une autre, mais cela ne fonctionne pas de cette façon. La taille de arr ne peut être déterminée que dans la même étendue que celle où elle a été déclarée, car sizeof fonctionne réellement au moment de la compilation.

Le tableau est passé en tant que pointeur. Il n’ya aucun moyen pour la fonction de savoir combien d’espace a été alloué au tableau.

Tous les tableaux se décomposent en pointeurs lorsqu’ils sont échangés. L’expression devient donc: sizeof(void*)/sizeof(int) ce qui équivaut à 1 sur les machines 32 bits avec 32 bits int et 2 sur les machines 64 bits avec 32 bits int .

Vous devez passer la longueur à la fonction ou créer une structure qui inclut un pointeur sur le tableau et la longueur du tableau. Aucune information de taille n’est stockée avec les tableaux C.

Un tableau en C est un type très fragile. Il existe de nombreuses situations dans lesquelles un tableau se décompose en un pointeur vers le premier élément, et le passage d’un tableau en tant qu’argument d’une fonction est une telle situation. Voir:

 int main() { char data[10]; // sizeof(data) == 10 return call_me(data); // data is equivalent to &data[0] here! } int call_me(char x[]) // int call_me(char * x) // same thing! { // here sizeof(x) == sizeof(char *) // ... } 

Les tableaux sont particuliers en C dans le sens où ils ne peuvent pas être passés en tant qu’arguments de fonction ni être renvoyés à partir de fonctions. Vous verrez donc souvent des pointeurs lorsque vous attendez des tableaux. Il incombe à l’appelant (vous!) De fournir suffisamment d’informations pour interpréter correctement un pointeur comme un tableau.

Notez qu’un langage C commun crée un “tableau” entièrement dynamic sans jamais mentionner un type de tableau: char * p = malloc(10); Ici, p n’est jamais autre chose qu’un pointeur, et c’est à vous de vous rappeler que vous pouvez le traiter comme un tableau.

(La situation est un peu meilleure en C ++, où vous pouvez passer des tableaux réels par référence.)

Voir la syntaxe pour la définition de la fonction peut être écrit de la manière suivante

  int DIMension(int array[]) { return sizeof(array )/ sizeof(int); } int DIMension(int *array) { return sizeof(array )/ sizeof(int); } int DIMension(int array[10]) { return sizeof(array )/ sizeof(int); } 

Toutes ces trois déclarations ont la même signification et la chose commune entre les trois est le tableau d’arguments qui n’est rien d’autre qu’un pointeur sur un tableau qui va toujours être de 4 octets.