2017-02-06 12 views
-1

Я только что написал следующий код и работает с g++. Это не должно работать. Почему он работает?Код обзора: const char * modify

#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; 
} 

, как это очевидно, что cstr является const так что изменение в линии cstr = "CPP"; не должен работать, но это работает. Зачем?

+2

Эта программа не определена, но не по этой причине. – molbdnilo

+0

Когда вы говорите: «Он работает с' g ++ '", вы имеете в виду, что он работает правильно или просто компилируется. Я ожидал бы сбой с ядром. –

+0

@MartinBonner Он работает правильно. – LifelongNoob

ответ

4

cstr - непостоянный указатель на константу. Его можно назначить и переназначить.

Постоянным указателем на константу будет char const* const cstr.

+0

Для полноты постоянным указателем на не-const будет 'char * const cstr'; –

+0

** Я испортил **, я всегда испортил определения, когда дело доходит до 'const' и' указателей'. – LifelongNoob

+0

@MartinBonner Максим Егорушкин, Спасибо, что указали это. – LifelongNoob

0

Этот код вызывает неопределенное поведение (если есть вход на cin):

std::cin>>cptr; 

Смысл этого кода, чтобы читать символы из cin и записать их в пространство, на который указывает cptr. Но вы не инициализировали cptr.

Когда программа имеет undefined behaviour, все может случиться, в том числе «работать как ожидалось».

+2

Я не думаю, что это ответ на вопрос, который задавал OP (что было связано с путаницей между 'char const * p 'и' char * const p'). Я согласен с тем, что код имеет UB кстати. –

0
const char *cstr; 

, как это очевидно, что cstr является сопзЬ

Нет, это не так.

Это не const, но предмет, на который он указывает, равен const.

Кроме того, вы пытаетесь прочитать буфер char, который не существует.

Прекратите использовать C-струны, а вместо этого возьмите себе несколько блестящих std::string.

+0

Мне больше нравится «std :: string», но в интервью я испортил C-Strings. – LifelongNoob

0

Кому-то, кто путается, как и я, когда дело доходит до указателей с объявлениями const, используйте http://cdecl.org/.