Вопрос о распределении строки Static C

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

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

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

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

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

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

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

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

 char* str = "Hello World"; 

а также

 char str[12]; 

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