Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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
动态内存分配在c中,释放在使用malloc()之前分配的部分内存_C_Dynamic Memory Allocation - Fatal编程技术网

动态内存分配在c中,释放在使用malloc()之前分配的部分内存

动态内存分配在c中,释放在使用malloc()之前分配的部分内存,c,dynamic-memory-allocation,C,Dynamic Memory Allocation,有没有办法释放使用malloc()创建的部分内存 假设:- int *temp; temp = ( int *) malloc ( 10 * sizeof(int)); free(temp); free()将释放所有20字节的内存,但假设我只需要10字节。我可以释放最后10个字节。您可以使用标准c库提供的realloc函数 C99标准7.20.3.4-1:realloc功能: realloc函数解除分配ptr指向的旧对象,并返回 指向新对象的指针,该对象的大小由大小指定。新报告的内容 对象应

有没有办法释放使用malloc()创建的部分内存

假设:-

int *temp;

temp = ( int *) malloc ( 10 * sizeof(int));
free(temp);

free()将释放所有20字节的内存,但假设我只需要10字节。我可以释放最后10个字节。

您可以使用标准c库提供的
realloc
函数

C99标准7.20.3.4-1:realloc功能:

realloc函数解除分配ptr指向的旧对象,并返回 指向新对象的指针,该对象的大小由大小指定。新报告的内容 对象应与解除分配前的旧对象相同,以新旧尺寸中较小者为准。新对象中超出旧对象大小的任何字节都有不确定的值


您应该使用标准库函数
realloc
。顾名思义,它重新分配了一块内存。其原型是(包含在标题
stdlib.h

该函数将
ptr
指向的内存块大小更改为
size
字节。此内存块必须由
malloc
realloc
calloc
调用分配。需要注意的是,
realloc
可以将旧块扩展到
大小
字节,可以保留相同的块并释放额外的字节,或者可以分配一个全新的内存块,将内容从旧块复制到新块,然后
释放
旧块

realloc
返回指向重新分配内存块的指针。如果它无法重新分配内存,那么它将返回NULL,并且原始内存块保持不变。因此,在调用
realloc
之前,应将
ptr
的值存储在临时变量中,否则原始内存块将丢失并导致内存泄漏。此外,您不应强制转换malloc的结果


我认为值得注意的是,
realloc
不一定会释放分配给
malloc
的部分内存;它可以选择分配一个新块,复制相关数据,并释放整个旧块。@sapi:True。标准引文清楚地说明了这一点。(用粗体标记)
 void *realloc(void *ptr, size_t size);
// allocate memory for 10 integers
int *arr = malloc(10 * sizeof *arr);
// check arr for NULL in case malloc fails

// save the value of arr in temp in case
// realloc fails
int *temp = arr;  

// realloc may keep the same block of memory
// and free the memory for the extra 5 elements
// or may allocate a new block for 5 elements,
// copy the first five elements from the older block to the
// newer block and then free the older block
arr = realloc(arr, 5 * sizeof *arr);
if(arr == NULL) {
    // realloc failed
    arr = temp;
}