Почему char * s = "привет";позволено? - PullRequest
5 голосов
/ 18 ноября 2011
char *s = "hello";

Приведенный выше код выделяет 6 байт в разделе программы, доступном только для чтения (я забыл название раздела), для хранения строки hello.Затем s инициализируется так, чтобы указывать на первый символ строки hello.Изменение строки "hello" - неопределенное поведение.Кроме того, "hello" сам по себе постоянен в природе.У программы нет прав на изменение раздела только для чтения.

Я использую MS VC ++ 2010 Express.Мой вопрос: почему компилятор позволяет s, что является char *, указывать на постоянную строку?Не должно ли быть ошибки компилятора?Разве компилятор не должен заставлять нас использовать const char *s = "hello"; вместо char *s = "hello";?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 18 ноября 2011

В C "hello" имеет тип char[]. Это не C ++. См этот вопрос .

2 голосов
/ 18 ноября 2011

Это происходит до того времени, когда квалификатор const был введен в C. Тело стандартов C очень консервативно по отношению к существующему коду.Любое улучшение языка должно быть сделано таким образом, чтобы оно не нарушало существующий соответствующий код, написанный для предыдущей версии стандарта.

Если такие вещи приводят к нежелательным осложнениям,затем эта функция устарела и возможно изменилась спустя годы после этого.

Для конкретной функции строковых литералов, набираемых char[] вместо char const[], да, к сожалению, это ловушка для начинающих,Просто возьмите с самого начала привычку использовать char const* всякий раз, когда вы ссылаетесь на такие строки.

Редактировать: На вопрос, может ли компилятор предупредить об этом, я думаю, это простотрудно отследить.В этом коде

int main(void) {
  "hello"[0] = 'H';
  char * a = "hoho";
  a[0] = 'H';
}

gcc дает мне только предупреждение о первом назначении, но не о втором.лязг не захватывает это вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...