Почему я получаю ошибку шины или ошибку сегментации при обычном вызове free ()? - PullRequest
1 голос
/ 18 апреля 2010

У меня очень простая тестовая программа, работающая на Solaris 5.8:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char *paths;
    paths = getenv("PATH");
    printf("Paths: %s\n", paths);

    free(paths); // this causes a bus error
    return 0;
}

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

Даже если я выделю память для *paths, free() вызовет ошибку шины. Есть ли какая-то причина, по которой попытка освободить память вызывает сбой?

Ответы [ 3 ]

5 голосов
/ 18 апреля 2010

Поскольку вы не должны free значение, возвращаемое getenv() (это статическая переменная)

1 голос
/ 18 апреля 2010

Строка, указанная указателем, возвращаемым этой функцией, не должна изменяться программой.

Освободить не вашу память.

1 голос
/ 18 апреля 2010

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

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