Освобождение памяти вне области указателя - PullRequest
0 голосов
/ 22 февраля 2019

Например:

char** fn() {
    char *x = (char *) malloc(10 * sizeof(char));
    char **y = (char **) malloc(2 * sizeof(char *));
    gets(x);
    y[0] = x;
    y[1] = &x[5];
    return y;
}

int main() {
    char **p = fn();
    printf("%s, %s\n", p[0], p[1]);
    free(p);
    return 0;
}

Теперь я освободил память, выделенную для y, с помощью free(p).Но это не освободило память, выделенную для x.Я не могу освободить его в fn(), потому что y[0] и y[1] все еще указывают на него и будут использоваться.

Так как же освободить память, выделенную для x?

1 Ответ

0 голосов
/ 22 февраля 2019

Вы выделили память для x, а затем присвоили ее элементу массива

char *x = (char *) malloc(10 * sizeof(char));
//...
y[0] = x;

Таким образом, вы можете освободить память таким же образом, но в обратном порядке

free(p[0]);
free(p);

Важной информацией для free является фактический адрес, который был возвращен malloc и т. Д., Независимо от того, где он хранится.Запись о том, сколько памяти было выделено, хранится внутри системы.Вы знаете, сколько, потому что это вы сделали это.

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