Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Malloc,Realloc,Free_C_Malloc_Free_Dynamic Memory Allocation_Realloc - Fatal编程技术网

Malloc,Realloc,Free

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

现在,堆将分配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指向的对象的生命周期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);