Как использовать функцию free () в c? - PullRequest
0 голосов
/ 08 ноября 2018

Я использую эту функцию в моей программе:

static void free_envp(char **envp)
{
    free(envp);
}

Я не могу понять, как я должен управлять ошибками и какие ошибки могут возникать, ни в Интернете, ни на странице руководства.

Кто-нибудь знает, что я должен знать об его использовании?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Аргумент envp звучит как указатель среды, который является частью определения main:

int main(int argc, char *argv[], char *envp[]);

Так же, как argv, вы не можете освободить envp. Он передается технологической средой.

(Если ваш параметр envp не имеет ничего общего с аргументом envp main, вы можете игнорировать эту часть моего ответа).

Примечание: вы передаете своей функции указатель на указатель, а затем освобождаете ее. Но, вероятно, цель указателя должна быть освобождена:

static void free_envp(char **envp)
{
    free(*envp);  // note the '*'
}
0 голосов
/ 08 ноября 2018

Функция free вызывается для освобождения памяти, выделенной в куче. то есть через malloc, calloc или realloc.

Вы должны передать тот же указатель, который был возвращен malloc в функцию free. Поскольку NULL может быть возвращено malloc в некоторых случаях, безопасно передать NULL в качестве аргумента free, так что free(NULL) просто ничего не делает.

Кроме того, вы должны вызывать функцию free только один раз за malloc. Вызов free для указателя, который не был выделен или уже был освобожден, является неопределенным поведением.

По этой причине может быть хорошей идеей установить указатель на NULL после освобождения is, если вы собираетесь использовать его снова.

int *p;
p = malloc(n * sizeof(int));  // n is size of the array
if (p == NULL)
{
    // Take appropriate action, e.g. exit the program.
}
....
.....

// After all use of the memory is over, if allocated properly before.
free(p);
p = NULL;
...