Разрешение C ++ "Инструкция в" x "ссылалась на память в" y " - PullRequest
0 голосов
/ 07 января 2010

У меня есть следующая программа, которая выдает ошибку во время выполнения:

* Инструкция в «x» ссылается на память в «y»

Память не может быть записана. *

Код:

int main() {
    char *str1 = "Rain";
    char *&str2 = str1;    
    cout << str1 << str2 << endl;
    *str1 = 'M';
    cout << str1 << str2 << endl;

    //Here the error happens
    *str2 = 'P';          

    cout << str1 << str2 << endl;    
    return 0;
}

В чем причина этой ошибки.

1 Ответ

6 голосов
/ 07 января 2010

Проблема в том, что строковый литерал технически является «указателем на символьный констант». Чтение справа налево указателя на неизменяемые символы. Из-за обратной сопоставимости с 'C' это может быть автоматически приведено компилятором к 'char pointer'. Это не означает, что базовый тип изменился, и поэтому изменение базового объекта const является неопределенным поведением.

char         *str1 = "Rain";  // Lie this is not a char* 
char const*   str9 = "Rain";  // This is the real type.

// String lieterals =>   "XXXXX" are char const*

Если вы хотите изменить строку, вам нужно объявить массив.

char         str6[] = "Rain";
str6[0] = 'M';
*str6   = 'P';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...