Почему эта маленькая программа на С вылетает? - PullRequest
0 голосов
/ 09 января 2012

Программа:

#include <stdio.h>
#include <stdlib.h>
int main(void) {
    char *a="abc",*ptr;
    ptr=a;
    ptr++;
    *ptr='k';
    printf("%c",*ptr);
    return 0;
}

Проблема в строке

*ptr='k';  

, когда я ее удаляю, программа работает нормально.Но я не могу понять причину.

Ответы [ 4 ]

6 голосов
/ 09 января 2012

Проблема в том, что вы пытаетесь изменить строковый литерал "abc" с помощью:

char *a="abc",*ptr;
ptr=a;                  // ptr points to the 'a'.
ptr++;                  // now it points to the 'b'.
*ptr='k';               // now you try to change the 'b' to a 'k'.

Это неопределенное поведение. Стандарт прямо заявляет, что вам не разрешено изменять строковые литералы в соответствии с разделом 6.4.5 String literals C99:

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

Это будет работать, если вы замените:

char *a="abc",*ptr;

с:

char a[]="abc",*ptr;

, поскольку он копирует строковый литерал в место, которое безопасно изменить.

0 голосов
/ 09 января 2012

Это:

char *a="abc";

действительно:

const char *a="abc";

Вы не можете изменить ptr, который указывает на тот же адрес, что и a.

0 голосов
/ 09 января 2012

Причина в том, что ваша строка "abc" находится в области памяти, доступной только для чтения.Он помещается туда компоновщиком.Вы пытаетесь изменить его в своей программе, и все ставки выключены.

0 голосов
/ 09 января 2012

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

См. Также этот вопрос: Строковые литералы: куда они идут?

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