Malloc,Realloc,免费

Jay*_*tel 1 c malloc free realloc dynamic-memory-allocation

int *p=malloc(20);
Run Code Online (Sandbox Code Playgroud)

现在Heap将分配20个字节的内存.并将第一个字节的地址返回到指针p.(假设没有返回NULL指针).

现在我这样做,

int *q=realloc(p, 40);
Run Code Online (Sandbox Code Playgroud)

现在他们有以下可能性:

1].q = P

2].!Q = P

3].Q = NULL

忘了可能性2和3.

现在我写道:

free(p);
Run Code Online (Sandbox Code Playgroud)

现在会发生什么?

前20个字节是否会被释放,休息仍然会被分配,或者所有40个字节都将被释放还是其他东西?

250*_*501 6

对free的调用将导致未定义的行为.这是推理:

函数realloc将通过指针p 释放1空格指针.

指向的对象的生命周期2在解除分配时结束.

函数free接收指向解除分配空间的指针并导致未定义的行为3.

此外,realloc调用之后指针p的值是不确定的,并且由于陷阱表示,其使用可能导致未定义的行为.

换句话说,即使从realloc返回的指针指向与指针p相同的空间的开头,realloc分配的对象也会计为具有新生命周期的新对象,并且可能无法使用指针p解除分配.


1(引自来自:ISO/IEC 9899:201x 7.22.3.5 realloc函数2)
realloc函数释放ptr指向的旧对象,并返回指向具有size指定大小的新对象的指针.

2(引用自:ISO/IEC 9899:201x 7.22.3内存管理功能1)
分配对象的生命周期从分配延伸到解除分配

3(引用自:ISO/IEC 9899:201x 7.22.3.3自由函数2)
否则,如果参数与先前由内存管理函数返回的指针不匹配,或者如果空间已通过调用free或de来释放realloc,行为未定义.

4(引自来自:ISO/IEC 9899:201x 6.2.4对象的存储持续时间2)
当指针指向(或刚刚过去)的对象到达其生命周期的末尾时,指针的值变得不确定.