무료로 전화하면 정의되지 않은 동작이 발생합니다. 여기에 이유가 있습니다 :
함수 realloc은 포인터 p에 의한 공간 포인터를 할당 해제합니다.
개체 p의 수명 은 할당 해제시에 끝납니다.
함수 free는 할당 해제 된 공간에 대한 포인터를 받고 정의되지 않은 동작을 발생합니다. .
또한 realloc 호출 후의 포인터 p 값은 불확정하고 그 사용은 트랩 표현으로 인해 정의되지 않은 동작을 일으킬 수 있습니다.
즉, 포인터가 realloc 지점에서 포인터 p와 같은 공간의 시작 부분으로 돌아온 경우에도 realloc에 의해 할당 된 객체는 새로운 수명을 가진 새로운 객체로 간주되며 포인터를 사용하여 할당이 해제되지 않을 수 있습니다 피.
realloc과 기능이 기존의 객체가 ptr이 가리키는 할당을 취소하고 새로운 개체에 포인터를 반환
1 (2는 201x 7.22.3.5 realloc과 기능 :/IEC 9899 ISO에서 인용) 크기로 지정된 크기입니다. (할당 된 개체의 수명이 해제
3까지 할당 로부터 연장
인용
2 은 (201x 7.22.3 메모리 관리 기능 1 : ISO/IEC 9899에서 인용) from : ISO/IEC 9899 : 201x 7.22.3.3 자유 함수 2)
인수가 메모리 관리 함수에 의해 이전에 리턴 된 포인터와 일치하지 않거나 free 또는 realloc에 대한 호출로 공간 할당이 해제 된 경우, 동작은 정의되지 않습니다.
4 을 (: 9899 ISO/IEC :에서 인용 개체 201x 6.2.4 보관 기간 2) 개체가 (또는 과거)을 가리키는 엔드에 도달 할 때 포인터
값은 불확정하게 그것의 평생의.
'realloc'이 널이 아닌 포인터를 리턴하면, 전달 된 포인터는 무효화됩니다 (즉,'free'd). 직접하지 않아도됩니다. – tkausl
40 바이트를 비울 것입니다. 재 할당시 아무 것도 움직일 필요가없는 것입니다. –
'q == p'이면'free'에 전달하는 데 아무런 차이가 없습니다. 어떤 변수를 사용했는지는 알지 못하지만 그 값만 알 수 있습니다. 그러나 그것은 나쁜 습관 일 것이고, 나는 그것을 학문적 인 질문으로 생각합니다. –