Код C - malloc и бесплатно - PullRequest
       1

Код C - malloc и бесплатно

2 голосов
/ 11 декабря 2011

рассмотрите следующий код:

int main()

{

int *a,address,size;

    a= (int *) malloc(10);
    address=(int*) a-1;
    size=(int ) *(a-1); // sorry there was a bug wrong casting, now its corrected.
    printf("address of malloc n:%d\n",address);
    printf("size of malloc block b:%d\n",size);
    printf("before%p",a);
    a=a+1;
    printf("\n after%p",a);    
    free(a);

    getch();

}

Адрес malloc "a" был увеличен, а затем освобожден (a + 1). Это приведет к утечке памяти, но как освободить будет знать конечную точку, пока не освободится, чтобы по ошибке не освободить следующий кусок памяти? Есть ли маркер конца, как в Char Array - '\ 0'?

Я прочитал в разделе 8.7 главы 8 K & R, что free поддерживает список, из которого свободные узнают, куда следует добавить блок свободной памяти.

Есть ли размер, из которого таблица объявлена ​​malloc? Тогда как будет работать приведенный выше код, я думаю, это был свободный список, верно? Просто добавим бесплатный связанный список, то есть +1 только к словам. и забудьте о другом месте памяти, которое приведет к утечке памяти.

Но когда вы выполняете malloc (), я прочитал, что он возвращает указатель-1 и даст размер выделенного блока malloc, я прав?

Может кто-нибудь объяснить это подробно?

Вопрос не связан с Кодексом. вот как точно работают функции Malloc и free друг с другом. если я скажу free (a), как точно функция free узнает конец блока?

Ответы [ 3 ]

3 голосов
/ 11 декабря 2011

Вы находитесь в сфере неопределенное поведение .

Свободно должен быть передан указатель, возвращаемый malloc в соответствии со стандартом:

Функция freeвызывает освобождение пространства, на которое указывает ptr, то есть делает его доступным для дальнейшего выделения.Если ptr является нулевым указателем, никаких действий не происходит.В противном случае, , если аргумент не совпадает с указателем, ранее возвращенным функцией calloc, malloc или realloc , или если пространство было освобождено при вызове free или realloc, поведение не определено.

- Стандарт ANSI 1988

Раздел 4.10.3.2: Функция free

3 голосов
/ 11 декабря 2011

Вы не можете задавать какие-либо вопросы о реализации C в целом.Вы делаете предположения о реализации C, некоторые из которых могут быть верными, но они не гарантируются верностью стандартом C.Возможно, в некоторых реализациях освобождение недопустимого указателя означает, что у вас утечка памяти, и, возможно, в некоторых реализациях чтение 4 байтов перед указателем, возвращенным malloc, даст вам размер выделенной памяти, но это не стандартизировано.,Код, который вы написали, вызывает неопределенное и определяемое реализацией поведение во многих местах.Не зная, о какой реализации C вы говорите, невозможно сказать вам, что будет делать код.Когда программа вызывает неопределенное поведение, реализация может делать все, что захочет.Соответствующая реализация C может привести к тому, что ваш компьютер превратится в дымящуюся кучу кремния для освобождения неверного указателя.Будет ли он?Не знаюПоведение вашего кода не определено.

Способ реализации free и malloc зависит от реализации, а не от стандарта C.Стандарт C объясняет, что делают функции, и каждая отдельная реализация C предоставляет соответствующие версии free и malloc на основе описаний этих функций в стандарте C.

3 голосов
/ 11 декабря 2011

Все, что можно сказать, вызов free(a+1) заключается в том, что он ведет к неопределенному поведению, поскольку malloc() и др.

и др. *1004*

никогда не возвращаются. При ближайшем рассмотрении size=(int *)*(a-1)Строка также приводит к неопределенному поведению, поскольку вы разыменовываете указатель вне выделенной области.

Механизм выделения памяти (то есть такие вещи, как свободные списки) зависят от реализации и на них не следует полагаться, кроме как в очень специфических и очень редких обстоятельств.

edit Если вам интересно узнать, как возможная реализация может работать, здесьописание одной популярной реализации malloc(): dlmalloc.

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