utilisation de l'opérateur sizeof
La sortie du programme suivant
#include<stdio.h>
int main(){
int *p[10];
printf("%ld %ld\n",sizeof(*p),sizeof(p));
}
est
8 <--- sizeof(*p) gives size of single element in the array of int *p[10]
80 <--- sizeof(p) gives size of whole array which is 10 * 8 in size.
maintenant voir le programme suivant
#include<stdio.h>
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
int array[] = {23,34,12,17,204,99,16};
int main()
{
int d;
printf("sizeof(array) = %ld \n",sizeof(array));
printf("sizeof(array[0]) = %ld \n",sizeof(array[0]));
printf("sizeof int %ld\n",sizeof(int));
printf("TOTAL_ELEMENTS=%ld \n",TOTAL_ELEMENTS);
for(d=-1;d <= (TOTAL_ELEMENTS-2);d++)
printf("%d\n",array[d+1]);
return 0;
}
est
sizeof(array) = 28
sizeof(array[0]) = 4 <--here
sizeof int 4
TOTAL_ELEMENTS=7
Ce que je ne suis pas en mesure de comprendre, c'est pourquoi le sizeof(tableau[0]) différentes dans les deux sorties.
Je pense qu'on est compilé pour une machine 64 bit, l'autre pour la version 32 bits.
int a 4 octets, même sur les ordinateurs 64 bits
aucun de ces deux programmes ont été exécutés sur la même machine.
vous avez écrit "même machine" - qu'est-ce que le compilateur/IDE et de la machine?
Rao Ubuntu 10.04 64 machine compilateur gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) de l'éditeur vi
int a 4 octets, même sur les ordinateurs 64 bits
aucun de ces deux programmes ont été exécutés sur la même machine.
vous avez écrit "même machine" - qu'est-ce que le compilateur/IDE et de la machine?
Rao Ubuntu 10.04 64 machine compilateur gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) de l'éditeur vi
OriginalL'auteur Registered User | 2011-03-26
Vous devez vous connecter pour publier un commentaire.
int *p[10];
est un tableau de pointeurs.
*p
est le premier élément de ce tableau de pointeurs. C'est donc un pointeur sur un entier. Il n'est pas un entier.
int array[] = {23,34,12,17,204,99,16};
est un tableau d'entiers. Doncarray[0]
est le premier élément de ce tableau. C'est donc un entier.De la taille d'un pointeur sur un entier (
*p
) et un entier (array[0]
) sont différentes.Donc
sizeof(*p)
etsizeof(array[0])
sont différents.
sizeof(p)
donne la taille du tableau de pointeurs. Il est donc: 10 x 8 = 80.c'est à dire (nombre d'éléments) x (de la taille d'un élément)
sizeof(array)
donne la taille du tableau d'entiers. Il est donc: 7 x 4 = 28.J'ai ajouté un peu plus d'infos. Voir si elles sont utiles.
oui, vos informations aidé.Si possible donner un lien pour cette information.
wikipedia article a quelques informations utiles sur sizeof
OriginalL'auteur Can't Tell
Dans le premier exemple, l'élément est un pointeur de type int, alors que dans le deuxième exemple, c'est juste int. Vous pouvez voir que le pointeur a 8 octets, de l'int à seulement 4 octets.
OriginalL'auteur Lukáš Lalinský
Dans le premier cas, vous avez créé un tableau de pointeurs sur int, de sorte que leur taille est de 8, pas 4.
OriginalL'auteur steabert
Dans le premier exemple, la taille d'un pointeur est utilisé et dans la seconde, la taille d'un entier. Ils peuvent avoir des tailles différentes, en particulier sur les systèmes 64 bits.
OriginalL'auteur jdehaan
array[0]
a typeint
*p
a typeint*
Cela démontre peut-être que le style de la folie de l'écriture
plutôt que
où le deuxième rend plus claire que int* est le type de la matrice être déclaré.
Utilisateur: Ils sont syntaxiquement identiques, comme je l'ai mentionné, c'est un choix stylistiques. Cependant
int*
décrit un type de données, il est donc logique que ce soit clair par les câlins, le modificateur de type*
son type de baseint
plutôt que de l'identificateurp
- il ne fait pas partie de l'identificateur.PS: Beaucoup de gens seront en désaccord avec moi, mais c'est le style illustré par Bjarne Stroustrup ici: www2.research.att.com/~bs/bs_faq2.html (je sais que c'est du C++, mais ce choix de style s'applique à C).
OriginalL'auteur Clifford
L'environnement 64 bits jeux de int de 32 bits et une longue et pointeur vers 64 bits ..
*p est un pointeur - 8 octets
sizeof(p) est la taille de 10 pointeurs - so 80 octets
Chances sont que vous avez AMD64 machine - vérifier les détails (y compris d'autres options)
http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html
OriginalL'auteur Abhi