Malloc,Realloc,Free
现在,堆将分配20字节的内存。并将第一个字节的地址返回给指针p(假设没有返回空指针) 现在我这样做Malloc,Realloc,Free,c,malloc,free,dynamic-memory-allocation,realloc,C,Malloc,Free,Dynamic Memory Allocation,Realloc,现在,堆将分配20字节的内存。并将第一个字节的地址返回给指针p(假设没有返回空指针) 现在我这样做 int *p=malloc(20); 现在他们有以下几种可能性: 1] 。q=p 2] 。q=p 3] 。q=NULL 忘记了可能性2和3 现在我写: int *q=realloc(p, 40); 现在会发生什么 前20个字节将变为空闲,其余的仍将被分配,或者全部40个字节将变为空闲,或者其他什么 调用free将导致未定义的行为。理由如下: 函数realloc将通过指针p解除空间指针的位置 p
int *p=malloc(20);
现在他们有以下几种可能性:
1] 。q=p
2] 。q=p
3] 。q=NULL
忘记了可能性2和3
现在我写:
int *q=realloc(p, 40);
现在会发生什么
前20个字节将变为空闲,其余的仍将被分配,或者全部40个字节将变为空闲,或者其他什么 调用free将导致未定义的行为。理由如下: 函数realloc将通过指针p解除空间指针的位置 p指向的对象的生命周期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或realloc释放了空间,则 行为是未定义的 4(引用自:ISO/IEC 9899:201x 6.2.4对象的存储期限2)
指针的值在以下情况下变得不确定:
它指向(或刚刚过去)的对象已到达其生命周期的末尾。调用free将导致未定义的行为。理由如下: 函数realloc将通过指针p解除空间指针的位置 p指向的对象的生命周期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或realloc释放了空间,则 行为是未定义的 4(引用自:ISO/IEC 9899:201x 6.2.4对象的存储期限2)
指针的值在以下情况下变得不确定:
它指向(或刚刚过去)的对象已到达其生命周期的终点。来自malloc/realloc手册页 函数的作用是:尝试更改分配的大小 由ptr指向大小,并返回ptr。如果不够的话 扩大空间 由ptr指向的内存分配,realloc()创建一个新的分配,复制尽可能多的由ptr指向的旧数据 适应新的分配, 释放旧的分配,并返回指向已分配内存的指针 您应该看看
malloc()
、free()
和realloc()
是如何工作的。
最简单的方法是使用简单的实现
来自malloc/realloc手册页 函数的作用是:尝试更改分配的大小 由ptr指向大小,并返回ptr。如果不够的话 扩大空间 由ptr指向的内存分配,realloc()创建一个新的分配,复制尽可能多的由ptr指向的旧数据 适应新的分配, 释放旧的分配,并返回指向已分配内存的指针 您应该看看
malloc()
、free()
和realloc()
是如何工作的。
最简单的方法是使用简单的实现
realloc(p,new_size)调整p指向的内存块的大小,该内存块以前是通过调用malloc或calloc分配的。
现在,如果在先前分配的内存附近有可用的内存,它返回的指针与我们传递给它的指针相同
因此,在这种情况下,如果您将释放(q),p&q都指向的空间将被删除
但是,如果在先前分配的内存附近没有可用的内存,那么它将为新分配的空间返回不同的指针,因此在这种情况下,如果您将释放(q),新分配的空间将被删除
在这两种情况下,删除的内存都是40位realloc(p,new_size)调整p指向的内存块的大小,该内存块以前是通过调用malloc或calloc分配的。
现在,如果在先前分配的内存附近有可用的内存,它返回的指针与我们传递给它的指针相同
因此,在这种情况下,如果您将释放(q),p&q都指向的空间将被删除
但是如果在先前分配的m附近内存不可用
free(p);