Pourquoi la taille d'un tableau envoyé en tant que paramètre n'est-elle pas la même que dans main?
#include <stdio.h>
void PrintSize(int p_someArray[10]);
int main () {
int myArray[10];
printf("%d\n", sizeof(myArray)); /* As expected, 40 */
PrintSize(myArray);/* Prints 4, not 40 */
}
void PrintSize(int p_someArray[10]){
printf("%d\n", sizeof(p_someArray));
}
sizeof
operator renvoie un objet de typesize_t
, vous devez donc l'imprimer avec%zu
(C99), ou le convertirint
si vous utilisez%d
comme ci-dessus dans vosprintf
appels.void PrintSize(int (*p_someArray)[10])
. L'intérieur de la fonction que vous pouvez accéder au tableau en utilisant l' opérateur de déréférencement*
:sizeof(*p_someArray)
. Cela aura le même effet que l'utilisation de références en C ++.C'est un pointeur, c'est pourquoi c'est une implémentation courante de passer la taille du tableau comme deuxième paramètre à la fonction
la source
Comme d'autres l'ont indiqué, les tableaux se désintègrent en pointeurs vers leur premier élément lorsqu'ils sont utilisés comme paramètres de fonction. Il convient également de noter que sizeof n'évalue pas l'expression et ne nécessite pas de parenthèses lorsqu'il est utilisé avec une expression, de sorte que votre paramètre n'est pas du tout utilisé, vous pouvez donc aussi bien écrire le sizeof avec le type plutôt que la valeur.
la source
Donc, vous devrez passer la longueur du tableau comme deuxième paramètre. Lorsque vous écrivez du code, dans lequel vous déclarez tous les deux un tableau de taille constante, puis passez ce tableau à une fonction, il est pénible de voir la constante de longueur de tableau apparaître à plusieurs endroits dans votre code ...
K&R à la rescousse:
Alors maintenant, vous pouvez faire par exemple:
la source
Parce que les tableaux se désintègrent en pointeurs lorsqu'ils sont passés en paramètres. C'est ainsi que fonctionne C, bien que vous puissiez passer des «tableaux» en C ++ par référence et résoudre ce problème. Notez que vous pouvez passer des tableaux de différentes tailles à cette fonction:
la source
Le comportement que vous avez trouvé est en fait une grosse verrue en langage C. Chaque fois que vous déclarez une fonction qui prend un paramètre de tableau, le compilateur vous ignore et change le paramètre en pointeur. Donc, ces déclarations se comportent toutes comme la première:
a sera un pointeur vers int dans les quatre cas. Si vous passez un tableau à func, il se désintégrera immédiatement en un pointeur vers son premier élément. (Sur un système 64 bits, un pointeur 64 bits est deux fois plus grand qu'un entier 32 bits, donc votre ratio sizeof renvoie 2.)
Le seul objectif de cette règle est de maintenir la compatibilité ascendante avec les compilateurs historiques qui ne prenaient pas en charge le passage de valeurs d'agrégation en tant qu'arguments de fonction.
Cela ne signifie pas qu'il est impossible de passer un tableau à une fonction. Vous pouvez contourner cette verrue en incorporant le tableau dans une structure (c'est essentiellement le but de std :: array de C ++ 11):
ou en passant un pointeur vers le tableau:
Dans le cas où la taille du tableau n'est pas une constante de compilation, vous pouvez utiliser la technique du pointeur vers un tableau avec des tableaux de longueur variable C99:
la source
En C ++, vous pouvez passer un tableau par référence dans ce but précis:
la source
En langage C, il n'y a pas de méthode pour déterminer la taille d'un tableau inconnu, donc la quantité doit être transmise ainsi qu'un pointeur vers le premier élément.
la source
char[]
tableaux de chaînes).Vous ne pouvez pas passer de tableaux à des fonctions.
Si vous voulez vraiment imprimer la taille, vous pouvez passer un pointeur vers un tableau, mais ce ne sera pas du tout générique car vous devez également définir la taille du tableau pour la fonction.
la source
Le comportement est voulu par la conception.
La même syntaxe dans la déclaration des paramètres de fonction signifie une chose complètement différente de la définition de variable locale.
La raison est décrite dans d'autres réponses.
la source
En langage C, lorsque vous passez le tableau en argument à la fonction, il est automatiquement converti en pointeur, le tableau passant d'une fonction à une autre fonction est appelé appel par référence. C'est la raison pour laquelle la fonction appelée ne reçoit que le pointeur qui pointe vers le premier élément de la fonction C'est la raison
fun (int a []) est similaire à fun (int * a);
Ainsi, lorsque vous imprimez la taille du tableau, il imprimera la taille du premier élément.
la source
Dans la langue de programmation 'C' 'sizeof ()' est l'opérateur et il renvoie la taille de l'objet en octets.L'argument de l'opérateur 'sizeof ()' doit être un type à valeur gauche (entier, nombre flottant, struct, tableau Donc, si vous voulez connaître la taille d'un tableau en octets, vous pouvez le faire très simplement.Utilisez simplement l'opérateur 'sizeof ()' et pour son argument utilisez le nom du tableau.Par exemple:
La sortie sur un système 32 bits sera: La taille de n est: 40.Parce que l'ineteger sur le système 32 est de 4 octets.Sur 64x, il est de 8 octets.Dans ce cas, nous avons 10 entiers déclarés dans un tableau.Le résultat est donc '10 * sizeof ( int) '.
Quelques conseils:
Si nous avons un tableau déclaré comme celui-ci 'int n [] = {1, 2, 3, ... 155 ..};'. Nous voulons donc savoir combien d'éléments sont stockés dans ce tableau. Utilisez cet alghorithme:
sizeof (nom_du_array) / sizeof (type_tableau)
Code: #include
principale(){
}
la source
sizeof(n)
pour une variable locale etsizeof(arg)
pour un argument d'une fonction, même si les deux sont apparemment de typeint[10]
.Les tableaux ne sont que faiblement dimensionnés. Pour la plupart, un tableau est un pointeur vers la mémoire. La taille dans votre déclaration indique uniquement au compilateur la quantité de mémoire à allouer pour le tableau - elle n'est pas associée au type, donc sizeof () n'a rien à faire.
la source