проблема с указателем на символ - PullRequest
4 голосов
/ 22 июня 2010

если мы объявляем char * p="hello";, то, поскольку он записан в разделе данных, мы не можем изменять содержимое, на которое указывает p, но мы можем изменить сам указатель.но я нашел этот пример в C Traps and Pitfalls Andrew Koenig AT & T Bell Laboratories Murray Hill, Нью-Джерси 07974

пример:

char *p, *q;
p = "xyz";
q = p;
q[1] = ’Y’;

q будет указывать на память, содержащую строку xYz.Так что p, потому что p и q указывают на одну и ту же память.

как это правда, если первое упомянутое мной утверждение также верно .. аналогично я запустил следующий код

main()
{
char *p="hai friends",*p1;
p1=p;
while(*p!='\0') ++*p++;
printf("%s %s",p,p1);
}

и получил вывод как ibj!gsjfoet

пожалуйста, объясните, как в обоих этих случаях мы можем изменять содержимое?заранее спасибо

Ответы [ 11 ]

0 голосов
/ 22 июня 2010

Модификация строковых литералов - плохая идея, но это не значит, что она может не работать.

Одна действительно веская причина не делать этого: вашему компилятору разрешено брать несколько экземпляров одного строкового литерала и заставлять их указывать на один и тот же блок памяти. Поэтому, если «xyz» был определен где-то еще в вашем коде, вы могли бы случайно нарушить другой код, который ожидал, что он будет постоянным.

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