web-dev-qa-db-fra.com

C, Malloc () et longueur du tableau

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().

15
GCBenson

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[].

25
effeffe

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*).

5
Luchian Grigore

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.

2
Rubens

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.

1
Mats Petersson