Строковые литералы хранятся таким образом, что они доступны на протяжении всей жизни программы; если ты пишешь
char *ptr = "This is a test";
все, что записано в ptr
, это адрес строкового литерала "This is a test"
. Даже если переменная ptr
выходит из области видимости, строковый литерал продолжает существовать в своем собственном разделе памяти, который является не тем же разделом, который используется malloc
(по крайней мере, не в уровень). Обратите внимание, что несколько экземпляров одного строкового литерала могут разрешаться в одном и том же месте; IOW, учитывая
char *p0 = "This is a test";
char *p1 = "This is a test";
p0
и p1
могут оба содержать один и тот же адрес (компилятору решать, отображаются ли множественные вхождения строковых литералов в одно и то же место или нет).
Когда вы звоните Container_new
, все, что вы делаете, это копируете адрес в container->buffer
и globalBuffer
; оба они указывают на одну и ту же вещь, которая существует независимо от того и другого. free
-ing container
не влияет на строковый литерал, на который указывает container->buffer
, поэтому printf(globalBuffer);
по-прежнему отображает "Test-string."
.
Таким образом, вы должны не звонить
free(container->buffer);
для этой конкретной программы, поскольку вы не присваивали ей результат вызова malloc
, calloc
или realloc
.
Если, ОТО, вы написали Container_new
как
Container* Container_new(char* buffer)
{
Container* container = malloc(sizeof(Container));
container->buffer = malloc(strlen(buffer) + 1); // Allocate memory to
if (container->buffer) // store a *new* instance
{ // of the input string.
strcpy(container->buffer, buffer); // This will need to be
} // freed before freeing
globalBuffer = buffer; // the container
return container;
}
тогда вам потребуется , чтобы освободить container->buffer
до освобождения container
.