простой C-код, дающий ошибку сегментации на gcc - PullRequest
1 голос
/ 30 декабря 2011

Я где-то нашел вопрос ... вот он и его ответ с объяснением.

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

 Answer:
 ibj!gsjfoet

 Explanation:
++*p++ will be parse in the given order

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

++ * p полученное значение будет увеличено

когда;встречается место, которое будет увеличиваться, то есть будет выполняться p ++

Следовательно, в цикле while начальное значение, на которое указывает p, равно 'h', которое изменяется на 'i' путем выполнения ++ * p и указателяперемещается в точку, «а», которая аналогичным образом меняется на «б» и так далее.Точно так же пустое пространство преобразуется в «!».Таким образом, мы получаем значение в p, которое становится «ibj! Gsjfoet», и поскольку p достигает «\ 0» и p1 указывает на p, таким образом, p1 ничего не печатает.

Я нашел что-то не так с объяснением на p1. Я думаю, что p1должен вывести «hai friends», и вывод p в порядке, как указано.

, но когда я попытался запустить тот же код на компиляторе gcc, он выдал ошибка сегментации

вот точный код, который я пытался запустить ..

 #include<stdio.h>
 int main()
 {
 char *p="hai friends",*p1;
 p1=p;
 while(*p !='\0') ++*p++;
 printf("%s   %s",p,p1);
 return 0;
 }

Если возможно отредактировать заголовок, я не смог найти подходящий заголовок, который бы объяснил ситуацию более четко.

РЕДАКТИРОВАТЬ:

Я пытался запустить измененный код, как предложено Mysticial , но я думаю, что вывод должен быть -

ibj!gsjfoet    hai friends

, потому что яувеличивая только p0, но p1 должно быть в качестве начального места, то есть по начальному адресу строки. Пожалуйста, если кто-нибудь может объяснить это, где я получаю это неправильно ???

Ответы [ 2 ]

4 голосов
/ 30 декабря 2011

Ну, во-первых, код, подобный следующему: ++*p++ следует избегать, потому что его обычно трудно читать.

Во-вторых, проблема в том, что вы модифицируете строковый литерал .Это неопределенное поведение.Не делайте этого.

Вместо этого измените объявление следующим образом:

char p[] = "hai friends";
char *p1;

и измените свой код следующим образом:

int main()
{

    char p[] = "hai friends";
    char *p0,*p1;
    p0 = p;
    p1 = p;
    while(*p0 !='\0') ++*p0++;
    printf("%s   %s",p0,p1);
    return 0;

}
1 голос
/ 30 декабря 2011

"hai friends" является литеральной строкой, которую нельзя изменить.

...