Duplicata possible:
Comment trouver la taille de (un pointeur pointant vers un tableau)
J'apprends à créer un tableau dynamique en C, mais j'ai rencontré un problème que je ne peux pas comprendre.
Si j'utilise le code:
int num[10];
for (int i = 0; i < 10; i++) {
num[i] = i;
}
printf("sizeof num = %li\n sizeof num[0] = %li", sizeof(num), sizeof(num[0]));
J'obtiens la sortie:
sizeof num = 40
sizeof num[0] = 4
C'est ce à quoi je m'attendrais. Cependant, si je malloc la taille du tableau comme:
int *num;
num = malloc(10 * sizeof(int));
for (int i = 0; i < 10; i++) {
num[i] = i;
}
printf("sizeof num = %li\n sizeof num[0] = %li", sizeof(num), sizeof(num[0]));
Ensuite, j'obtiens la sortie:
sizeof num = 8
sizeof num[0] = 4
Je suis curieux de savoir pourquoi la taille du tableau est de 40 lorsque j'utilise la méthode de longueur fixe, mais pas lorsque j'utilise malloc()
.
Dans le second cas, num
n'est pas un tableau, c'est un pointeur. sizeof
vous donne la taille du pointeur, qui semble être de 8 octets sur votre plateforme.
Il n'y a aucun moyen de connaître la taille d'un tableau alloué dynamiquement, vous devez le sauvegarder ailleurs. sizeof
examine le type, mais vous ne pouvez pas obtenir un type de tableau complet (type de tableau avec une taille spécifiée, comme le type int[5]
) du résultat de malloc
de quelque façon que ce soit, et l'argument sizeof
ne peut pas être appliqué à un type incomplet, comme int[]
.
Les tableaux ne sont pas des pointeurs (la décroissance des pointeurs dans certaines situations, pas ici).
Le premier est un tableau - donc sizeof
vous donne la taille du tableau = 40 octets.
Le second est un pointeur (quel que soit le nombre d'éléments vers lequel il pointe) - sizeof
vous donne sizeof(int*)
.
La deuxième taille fait référence à la taille d'un pointeur, qui, dans votre machine - probablement 64 bits -, est de 8 octets.
Vous ne pouvez pas utiliser sizeof()
pour récupérer la taille d'une structure allouée dynamiquement, mais vous pouvez le faire pour les structures allouées statiquement.
Si vous voulez connaître la taille de quelque chose que vous avez alloué, vous devez vous en souvenir vous-même, car votre code a fait l'allocation. Si votre code n'a pas effectué l'allocation, il n'y a aucun moyen [dans un sens standard] de déterminer la taille de la mémoire vers laquelle pointe un pointeur. Il vous suffit de "connaître" d'une autre manière.