Бесплатно дает ошибку - PullRequest
0 голосов
/ 07 июля 2011

Рассмотрим следующие две программы:

/***************correct: no error for this code **************/
#include <stdio.h>
#include <string.h>
int main()
{

char  *p ,*q ;
p =(char *)malloc(10) ;
 strcpy( p , "AB") ;
*p = '\0' ;
p++ ;
q = p ;
//*q = 32 ;
free(q) ;
return 0;
}
/*************code2 which gives error ********************/
#include <stdio.h>
#include <string.h>
int main()
{

int  *p ,*q ;
p =(int  *)malloc(10) ;
*p = 30 ;
p++ ;
q = p ;
*q = 32 ;
free(q) ;
return 0;
}

Можете ли вы объяснить, почему первая работает, а вторая нет?

Ответы [ 3 ]

13 голосов
/ 07 июля 2011

Код, который работает "правильно", имеет неопределенное поведение . Это просто (неудача), что это работает. На самом деле, похоже, что работа - это худшее, что может случиться в результате UB (не поднимает тревогу). Другой код, который не работает, также имеет неопределенное поведение.

Вы можете позвонить free только по указателю, возвращенному malloc, realloc или calloc

1 голос
/ 07 июля 2011

Стандарт C говорит, что вы не можете использовать free () для обычных указателей. Она говорит, что функция free () выполняет свое действие, когда она используется с функциями динамического распределения памяти, такими как malloc (), calloc () и realloc(). Даже если вы попытаетесь использовать free (), передав нормальный указатель, который не связан с malloc (), calloc () и realloc (), это приводит к неопределенному поведению, это может привести к ошибке сброса ядра или аварийному завершению икод работает с вашим компилятором, потому что компилятор может быть разработан по-другому (например, компилятор обучения студентов), код работает даже с TURBO c, но он действительно терпит неудачу, когда вы работаете с компиляторами cygwin или gcc. Я предлагаю вамРаботайте с компиляторами cygwin и gcc, а не с другими компиляторами, потому что они дают вам огромный опыт и знания, даже если вы можете изучить концепции многопоточности.

0 голосов
/ 07 июля 2011

Я считаю, что оба кода неверны и должны привести к сбою. Как и при malloc, ОС сохраняет начальный адрес памяти, возвращаемый malloc, а free можно вызывать только по адресу, указанному malloc.

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