2017-09-17 3 views
1

Je suis nouveau sur le langage de programmation c et les pointeurs d'apprentissage maintenant. J'ai besoin d'une petite clarification dans le moulage de pointeur.Quel est le résultat de la diffusion d'un pointeur sur un littéral de chaîne en tant que pointeur int?

#include<stdio.h> 

int main(){ 

char *c = "hello"; 
for(int i = 0;i<5;i++) 
    printf("c:%c %d\n",c[i],c[i]); 
int *ip = (int*)c; 
printf("after casting"); 
printf("c:%d\n",*ip); 
return 0; 
} 
OUTPUT: 
c:h 104 
c:e 101 
c:l 108 
c:l 108 
c:o 111 
after castingc:1819043176 

Alors, quelle est cette valeur 1819043176? n'importe quelle valeur de poubelle ou il représente n'importe quoi. Dans ce programme, après avoir transtypé le pointeur char en pointeur entier. ce printf ("c:% d \ n", * ip); déclaration montre une valeur de l'IP comme 1819043176. Je ne peux pas comprendre quelle est cette valeur 1819043176

s'il vous plaît aidez-moi à comprendre. Je vous remercie.

+4

Vous enfreignez la règle stricte d'alias, vous avez un comportement indéfini. –

+0

Je vous suggère d'imprimer la valeur casted en tant que * hex * et de garder une [table ASCII] (http://en.cppreference.com/w/c/language/ascii) à proximité (ou simplement d'imprimer les caractères séparés en hexadécimal ainsi). –

+4

Vous n'êtes pas vraiment autorisé à faire ce casting. Mais si vous convertissez 1819043176 en hexadécimal, vous obtenez '0x6C6C6568'. Étonnamment, ce sont les codes ASCII pour '' l''' '' '' '' '' '' '' '' '' '' et '' h''. Devinez d'où viennent ces valeurs. –

Répondre

0

Votre programme fait quelque chose qui n'est pas autorisé - convertir un pointeur char en un pointeur int. En fonction d'une plate-forme, certains pointeurs char peuvent ne pas avoir de représentation valide en tant que pointeur int, la conversion est donc interdite. ce que vous voyez est un comportement indéfini.

Cependant, il y a une explication rationnelle de ce qui se passe. Pensez à ce programme qui copie une chaîne dans un tableau d'entiers:

int data[2] = {0}; 
strcpy((char*)data, "hello"); 
printf("%s\n", (char*)data); 
printf("%d\n", data[0]); 

Ceci est permis, parce que int pointeur peut être converti en char pointeur sur toutes les plateformes (en fait, la norme exige que tous les pointeurs d'objet pour être converti en char*). Le résultat printed dans ce programme correspond à la valeur obtenue, c'est-à-dire 1819043176. Il s'agit d'un nombre spécifique à la plateforme résultant de la réinterprétation des quatre octets initiaux "hello" en tant qu'entier.

+0

merci beaucoup @ dasblinkenlight –