Вопрос по c – почему эта программа не дает ожидаемый результат? [Дубликат]

0

Possible Duplicate:
Why do I get a segmentation fault when writing to a string?

int main()
{
    char *c = "abc";
    *c = 'd';
    printf("%s",c);
    return 0;
}

Когда я пытался запустить эту программу в C, то программа вылетает. Я хочу знать, в чем здесь ошибка?

Если вам интересно,char c[4] = "abc"; буду работать. Samuel Edwin Ward
c указывает на строковый литерал, который, в свою очередь, не изменяется, но вы пытаетесь изменить один из символов. Jeff Mercado

Ваш Ответ

2   ответа
1

"abc" является строковым литералом.

*c = 'd' это попытка изменить этот строковый литерал.

Вы не можете изменять строковые литералы.

@WilliamPursell: Попытка изменить строковые литералы приводит к неопределенному поведению. Даже если он не падает на какой-либо платформе, это может вызвать другие ошибки (например, изменение другой строки).
@WilliamPursell: Вы не можете, если хотите, чтобы ваша программа демонстрировала определенное поведение.
Обратите внимание, что на некоторых платформах вы можете изменять строковые литералы.
3

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

Всякий раз, когда вы назначаете строковый литералchar указатель, всегда квалифицируйте его какconst чтобы компилятор предупреждал вас о таких проблемах:

const char *c = "abc";
*c = 'd'; // the compiler will complain

Если вы действительно хотите изменить строковый литерал (хотя не непосредственно сам по себе, а его копию), я бы предложил использоватьstrdup:

char *c = strdup("abc");
*c = 'd'; // c is a copy of the literal and is stored on the heap
...
free(c);
Error: User Rate Limit Exceededchar *Error: User Rate Limit Exceededchar **.
Error: User Rate Limit Exceeded

Похожие вопросы