2013-06-04 5 views
3

Dans Visual Studio 2012, je suis de déconner avec des pointeurs, et je compris que ce programme a gardé de s'écraser:C++ réglage de pointeur char null

#include  <iostream> 
    using std::cout; 
    using std::endl; 

    int main() 
    { 

     const char* pointer = nullptr; 

     cout << "This is the value of pointer " << pointer << "." << endl; 

     return 0; 

    } 

Mon intention a été l'ensemble un pointer à null, puis imprimer l'adresse. Même si le programme compile, il se bloque pendant l'exécution. Quelqu'un peut-il expliquer ce qui se passe?

De plus, quelle est la différence dans pointer et *pointer

+0

@jogojapan Et une copie de beaucoup de questions là-bas. –

+0

@MarkGarcia oui ...? – jogojapan

Répondre

7

Vous utilisez un const char* qui, lorsqu'il est utilisé dans l » operator <<std::cout, est interprétée comme une chaîne.

Moulage à void* pour voir la valeur de pointeur (l'adresse qu'il contient):

cout << "This the value of pointer " << (void*)pointer << "." << endl; 

Ou si vous voulez être pédant:

cout << "This the value of pointer " << static_cast<void*>(pointer) << "." << endl; 

LIVE EXAMPLE

+0

génial, merci beaucoup! est-il un moyen d'imprimer l'emplacement de la mémoire sans avoir à pointer le type? – Bbvarghe

+0

'static_cast (pointeur)' serait plus élégant. –

+0

@TadeuszKopec Et pédant. :) –

1

Bien que vous puissiez fais cout << "Pointer is " << (void*)pointer << ".\n"; comme déjà suggéré Je sens que dans ce cas la "façon C" de le faire est plus jolie (pas de casting) et plus lisible: printf("Pointer is %p\n",pointer);

+1

Formellement, cela nécessiterait aussi un cast, puisque la conversion '% p' nécessite un' void * '. En C, 'char *' et 'void *' sont cependant requis pour avoir la même représentation, et je suis presque sûr qu'il en est ainsi aussi en C++, donc, malgré l'inexactitude formelle, aucune implémentation sensée ne peut faire quelque chose d'inattendu 'char *' pour la conversion '% p' [pour les valeurs de" sensible "qui n'incluent pas la punition intentionnelle des personnes qui omettent la distribution]. Il pourrait "honnêtement" casser pour les pointeurs vers d'autres types que les types de caractères, car ceux-ci n'ont pas besoin d'avoir la même représentation. –