Ну, вы правы.Теперь давайте рассмотрим первый фрагмент кода.
char *test = (char*) malloc(12*sizeof(char));
Над кодом нет проблем.
test = "testingonly";
Здесь вы изменили указатель test
, ведущий к утечке памяти.И когда вы пытаетесь освободить, вы освобождаете не фактический выделенный указатель, а один «тестирующий» литерал, указывающий на.Литерал указывает на постоянную память, которая не может быть переопределена в обычных сценариях.
Теперь о втором фрагменте кода, это будет работать нормально, если вы явно скопировали данные из того места, где находится литерал, в кучу, куда указывает test
.
К вашему второму пункту да strcpy
- это обычный способ.Другие способы - это memcpy, если вы копируете необработанные байты.
ПРИМЕЧАНИЕ. Литералы не хранятся в стеке.Но вы не можете изменить место, где хранятся литералы.