Вопрос о выделении статической строки C - PullRequest
4 голосов
/ 02 октября 2010

Рассмотрим следующий код:

char* str = "Hello World";
memcpy(str, "Copy\0", 5);

Во время memcpy возникает ошибка сегментации. Однако, используя этот код:

char str[12];
memcpy(str, "Hello World\0", 12);
memcpy(str, "Copy\0", 5);

Программа не выдает ошибку сегментации.

Возникает ли проблема при распределении памяти в стеке по сравнению с разделом данных?

Ответы [ 2 ]

11 голосов
/ 02 октября 2010

Когда вы используете строковый литерал в gcc, значение помещается в постоянную память и не может быть изменено. Попытка изменить это приводит к неопределенному поведению. Обычно вы получаете ошибку сегментации в Linux, когда вы пытаетесь это сделать.

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

2 голосов
/ 02 октября 2010
char* str = "Hello World";

и

char str[12];

- две совершенно разные вещи.Один размещает указатель на стек и массив в «сегменте кода» только для чтения.Затем указатель указывает на массив.Другой размещает весь массив в стеке, и указатель отсутствует.

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