Sizeof pour determiner automatiquement la taille d'un tableau

Résolu
cs_Chatbour Messages postés 764 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 6 septembre 2010 - 2 sept. 2010 à 09:57
cs_Chatbour Messages postés 764 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 6 septembre 2010 - 3 sept. 2010 à 13:32
Salut à tous et à toutes,

je me remets a C++ après une longue pause, donc soyez indulgents ^^

je me demande pourquoi ce code donne un résultat faux :

#include 
using namespace std;

void show(int array[])
{
for(int i=0; i<sizeof(array)/sizeof(int); i++)
{
cout << array[i] << ":";
}
cout << endl;
}

int main()
{
int arr[] = {5, 4, 3, 2, 1};
show(arr); // 1
cout << sizeof(arr)/sizeof(int); // 2
}


la fonction show n'affiche que la première case du tableau, pourtant l'expression 2 affiche la taille convenable du tableau arr : 5 . Quelqu’un a-t-il une explication ? Merci.

2 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
2 sept. 2010 à 13:13
Salut,

En C/C++, un tableau ne contient que ses données. Il ne contient pas d'information sur lui même tel que sa taille, comme c'est le cas en java, vb, delphi...

Tout ce que reçoit show en paramètre, c'est un pointeur où est supposé se trouver une certaine quantité d'entiers. Il ne peut pas savoir combien.

C'est peut être un peu plus clair sur cette exemple de cette page :
    int days[] = {1,2,3,4,5};
    int *ptr = days;
    printf("%u\n", sizeof(days));
    printf("%u\n", sizeof(ptr));


Dans le cas de ptr, sizeof renvoie la taille de ptr, c'est à dire un pointeur, donc 4 octets dans un prog 32 bits (Ce qui est la taille d'un int dans ton code -> 4 / 4 -> 1).

Pour ton code, tu peux par exemple réserver la première case du tableau pour contenir la taille, ou l'ajouter en argument à ta fonction show.
3
cs_Chatbour Messages postés 764 Date d'inscription jeudi 27 juillet 2006 Statut Membre Dernière intervention 6 septembre 2010 19
3 sept. 2010 à 13:32
merci beaucoup :)
0
Rejoignez-nous