Объяснение указателя C ++ - PullRequest
2 голосов
/ 23 мая 2011
char* pstr[] = { "Robert Redford", // Initializing a pointer array
                 "Hopalong Cassidy",
                 "Lassie",
                 "Slim Pickens",
                 "Boris Karloff",
                 "Oliver Hardy"
               };

Если я напишу, как показано ниже:

*pstr[0] = 'X';

Программа может скомпилироваться, но вылетает при выполнении этого оператора.Зачем?Я думал, что * pstr [0] - это «R», так что я могу изменить с «R» на «X».Спасибо!

Ответы [ 4 ]

7 голосов
/ 23 мая 2011

Компилятор должен был предупредить вас:

warning: deprecated conversion from string constant to 'char*''

То, что вы здесь делаете, - это присваиваете несколько константных массивов символов для изменяемого указателя символов, например:

const char[] astring = "ababa";
char* mutablestring = astring; // shouldn't be possible
mutablestring[0] = 'o'; // change 'readonly' location

Результатом является во время выполнения указатель, который указывает на ваш двоичный файл и в который вы пишете.Но это только для чтения, так что ... сбой.

7 голосов
/ 23 мая 2011

Вы делаете указатель на массив const char* s.Так что pstr [0] указывает на const char*, и вы не можете изменить его значение.

Хорошая практика программирования - писать этот код таким образом, так что вы получите ошибку компилятора, если попытаетесьизменить значение вместо ошибки времени выполнения:

char* const pstr[] = { "Robert Redford", // Initializing a pointer array
                 "Hopalong Cassidy",
                 "Lassie",
                 "Slim Pickens",
                 "Boris Karloff",
                 "Oliver Hardy"
               };
2 голосов
/ 23 мая 2011

pstr - массив с const *char элементами. Результат изменения только для чтения памяти не определен. Если вы знаете максимальный размер каждой строки, вы можете объявить pstr примерно так

char pstr[][32] = { "Robert Redford",
                 "Hopalong Cassidy",
                 "Lassie",
                 "Slim Pickens",
                 "Boris Karloff",
                 "Oliver Hardy"
               };
2 голосов
/ 23 мая 2011

Строковые литералы являются константами, поэтому вы не можете их изменить.

Преобразование из const char* в char* допускается только для того, чтобы разрешить старый код C со времени до того, как C получил const.

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