2017-02-06 3 views
-1

Ich habe nur folgenden Code geschrieben und es funktioniert mit g++. Es sollte nicht funktionieren. Warum funktioniert es?Code-Überprüfung: const char * Änderung

#include <iostream> 
using namespace std; 

int main() 
{ 
     //char const *cstr; 
     const char *cstr; 
     char *cptr; 
     std::cin>>cptr; 
     cstr = cptr; 
     cstr = "CPP"; 
     cout<<cstr; 
     return 0; 
} 

wie es offensichtlich ist, dass cstrconst ist so ist es Änderung in Zeile cstr = "CPP"; nicht funktionieren sollte, aber es funktioniert. Warum?

+2

Dieses Programm ist nicht definiert, aber nicht aus diesem Grund. – molbdnilo

+0

Wenn Sie sagen "es funktioniert mit' g ++ '", meinst du, es läuft korrekt oder nur, dass es kompiliert. Ich würde erwarten, mit einem Core Dump zu stürzen. –

+0

@MartinBonner Es läuft korrekt. – LifelongNoob

Antwort

4

cstr ist ein nicht konstanter Zeiger auf eine Konstante. Es kann zugewiesen und neu zugewiesen werden.

Ein konstanter Zeiger auf eine Konstante wäre char const* const cstr.

+0

Der Vollständigkeit halber wäre ein konstanter Zeiger auf nicht-const 'char * const cstr'; –

+0

** Ich vermasselt **, ich bin immer verwirrt Definitionen, wenn es um "const" und "Zeiger" kommt. – LifelongNoob

+0

@MartinBonner Maxim Egorushkin, vielen Dank, dass Sie darauf hingewiesen haben. – LifelongNoob

0

Dieser Code verursacht nicht definiertes Verhalten (wenn es eine Eingabe auf cin ist):

std::cin>>cptr; 

Die Bedeutung dieses Codes ist Zeichen von cin und schreiben sie in den Raum zu spitz durch cptr zu lesen. Aber Sie haben cptr nicht initialisiert.

Wenn ein Programm undefined behaviour hat, kann alles passieren, einschließlich "funktioniert wie erwartet".

+2

entwarf. Ich denke nicht, dass dies eine Antwort auf die Frage ist, die das OP stellte (was über eine Verwechslung zwischen 'char const * p 'und' char * const p'). Ich stimme zu, dass der Code UB btw hat. –

0
const char *cstr; 

wie es offensichtlich ist, dass cstr const ist

Nein, ist es nicht.

Es ist nicht const, aber die Sache, auf die es zeigt, ist const.

Außerdem versuchen Sie, in einen char Puffer zu lesen, der nicht existiert.

Hören Sie auf, C-Strings zu verwenden, und holen Sie sich stattdessen glänzende std::string s.

+0

Ich fühle mich besser mit 'std :: string', aber in Interviews vermassle ich mich mit C-Strings. – LifelongNoob