web-dev-qa-db-fra.com

Pourquoi sizeof (* "327") renvoie 1 au lieu de 8 sur un système 64 bits?

 printf("%lu \n", sizeof(*"327"));

J'ai toujours pensé que la taille d'un pointeur était de 8 octets sur un système 64 bits mais cet appel revient sans cesse 1. Quelqu'un peut-il fournir une explication?

22
lordgabbith

Mettre * Avant un littéral de chaîne déréférencera le littéral (car le littéral de chaîne est un tableau de caractères et se désintégrera pour pointer vers son premier élément dans ce contexte). La déclaration

printf("%zu \n", sizeof(*"327")); 

est équivalent à

printf("%zu \n", sizeof("327"[0]));  

"327"[0] Donnera le premier élément de la chaîne littérale "327", Qui est le caractère '3'. Le type de "327", Après décroissance, est de char * Et après le déréférencement, il donnera une valeur de type char et finalement sizeof(char) est 1.

62
haccks

La déclaration:

printf("%lu \n", sizeof(*"327"));

affiche en fait la taille d'un char, comme en utilisant * déréférence le premier caractère de la chaîne 327. Changez-le en:

char* str = "327";
printf("%zu \n", sizeof(str));

Notez que nous devons utiliser %zu ici, au lieu de %lu, car nous imprimons un size_t valeur .

19
Marievi

Le littéral de chaîne est un tableau de caractères statique anonyme, qui se désintègre en un pointeur vers son premier caractère, c'est-à-dire une valeur de pointeur de type char *.

En conséquence, une expression comme *"abc" Est équivalente à *someArrayOfCharName, Qui à son tour est équivalente à *&firstCharInArray, Ce qui donne firstCharInArray. Et sizeof(firstCharInArray) est sizeof(char) qui est 1.

4
CiaPan