С-код вылетает из memmove - PullRequest
       30

С-код вылетает из memmove

0 голосов
/ 16 марта 2012

Мой код не падает, когда я пишу:

char s[44] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
memmove(s, "asdf", 5);

Но это происходит, когда я пишу:

char* s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
memmove(s, "asdf", 5);

Кто-нибудь знает почему?

Ответы [ 3 ]

7 голосов
/ 16 марта 2012

первый выделяет место и помещает в

второй указатель на постоянную память, вы не можете его изменить

1 голос
/ 16 марта 2012

char* s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

строковая константа "aaaa", которая хранится в памяти, которая доступна только для чтения.Например, в исполняемых файлах elf они будут храниться в разделе .rodata, который недоступен для записи.Поэтому, когда вы пытаетесь записать в таком месте, это приводит к ошибке

С другой стороны, char s[] будет хранить строку в локальной области стека, которую вы можете изменить.

1 голос
/ 16 марта 2012

В первом случае в стеке выделяется 44 байта, и строка "aa..a" копируется в это пространство.Но во втором пространстве строка «aa..a» является постоянным значением и хранится в сегменте данных только для чтения.Таким образом, сбой страницы произойдет, когда вы попытаетесь записать адрес памяти только для чтения.

...