char * p = "orkut" против const char * p = "orkut" - PullRequest
1 голос
/ 01 апреля 2010
 char *p="orkut" vs const char *p="orkut"

какая разница между этими двумя ...

EDIT

от Бьярне Страуструпа, 3-е издание, стр. 90

void f()
{

char* p="plato";
p[4]='e' // error: assign to const;result is undefined

}

этот тип ошибки не может быть общим b пойман до времени выполнения и реализации отличаются в применении этого правила То же самое с const char * p = "plato"

Вот почему я спрашиваю разницу ... Каково значение const здесь ..

Ответы [ 5 ]

7 голосов
/ 01 апреля 2010

Вариант const char* правильный.

Вы не должны изменять память, которая исходит из строкового литерала (обычно называемого статическим хранилищем).Это только для чтения памяти.

Разница в том, что вариант char* позволит вам написать синтаксис для изменения данных, на которые он указывает, путем разыменования его.Что он на самом деле делает, хотя и не определено.

//Option 1:
char *p = "orkut";
*p = 'x';//undefined behavior


//Option 2:
const char *q = "orkut";
*q = 'x';//compiling error

Я бы предпочел, чтобы вариант 2 случился со мной.

0 голосов
/ 02 апреля 2010

обратите внимание, что более поздние реализации gcc не позволят вам сделать

  char *foo = "foo";

они настаивают на const (конечно, в режиме -wall -werror)

0 голосов
/ 02 апреля 2010

См. этот вопрос .

В основном,

char *p="orkut";

В этом случае p означает , предполагается, только для чтения, но это не применяется всеми компиляторами (или стандартом).

0 голосов
/ 01 апреля 2010

Проблема, которую обсуждает Страуструп в цитируемом вами тексте, состоит в том, что в C ++ строковый литерал легко преобразуется в «тип типа« указатель на символ »(4.2 / 2« Преобразование массива в указатель »).специально для того, чтобы очень распространенная идиома указания char* на буквальную строку не приводила к сбою базилиона программ (особенно, когда C ++ изначально развивался из C).

Если вы можетеизбегая объявления указателя как char const* (или эквивалентного const char*), вы избавитесь от проблем, подобных тем, которые описаны в цитате Страуструпа. Однако вы можете столкнуться с раздражающими проблемами, используя указатель с функциямиэто не на 100% верно.

0 голосов
/ 01 апреля 2010

Объявление const char * p означает, что вещь, на которую указывает p, является const, то есть не должна меняться. Я не должен говорить, потому что можно отбросить постоянство. Как уже указывалось, изменение строкового литерала не определено и часто приводит к нарушению доступа / ошибке сегментации.

Не то, чтобы это объявление отличалось от char * const p, что означает, что p само по себе оно const, а не то, на что указывает p.

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