1、realloc函数
realloc函数,用于调整已经分配的内存区域的大小。它的原型如下:
1void* realloc(void* ptr, size_t size);
realloc函数接受两个参数:ptr是指向已经分配的内存区域的指针,size表示新的内存区域大小。realloc函数会尝试将原有的内存区域大小调整为新的大小,并返回指向新内存区域的指针。如果调整成功,原有的数据将被保留;如果调整失败(例如,系统没有足够的连续内存空间),则原有的内存区域保持不变,并返回NULL。
需要注意的是,如果新的size参数小于原有内存区域的大小,realloc函数可能会减少内存区域的大小,并丢弃超出新大小的数据。因此,在使用realloc函数时,需要确保正确处理可能的数据丢失情况。
realloc函数的示例代码:
- 1#include <stdio.h>
- 2#include <stdlib.h>
- 3
- 4int main(int argc, char *argv[]) {
- 5 int* p;
- 6 int n = 5;
- 7
- 8 // 使用malloc分配内存
- 9 p = (int*)malloc(n * sizeof(int));
- 10 if (p == NULL) {
- 11 printf("内存分配失败!\n");
- 12 return 1;
- 13 }
- 14
- 15 // 使用分配的内存
- 16 for (int i = 0; i < n; i++) {
- 17 p[i] = i + 1;
- 18 }
- 19
- 20 // 打印数组元素
- 21 for (int i = 0; i < n; i++) {
- 22 printf("%d ", p[i]);
- 23 }
- 24 printf("\n");
- 25
- 26 // 调整内存大小 ,假设需要更大的内存空间
- 27 n = 10;
- 28 p = (int*)realloc(p, n * sizeof(int));
- 29 if (p == NULL) {
- 30 printf("内存调整失败!\n");
- 31 return 1;
- 32 }
- 33
- 34 // 使用新的内存空间
- 35 for (int i = n / 2; i < n; i++) {
- 36 p[i] = i + 1;
- 37 }
- 38
- 39 // 打印调整后的数组元素
- 40 for (int i = 0; i < n; i++) {
- 41 printf("%d ", p[i]);
- 42 }
- 43 printf("\n");
- 44
- 45 // 释放内存
- 46 free(p);
- 47
- 48 return 0;
- 49}
在上面的示例中,首先,使用malloc函数分配了一个大小为5个int类型的内存区域。然后,使用realloc函数将该内存区域的大小调整为10个int类型的大小,并继续使用这块内存存储数据。最后,使用free函数释放了这块内存。
2、free函数
无论是使用malloc、calloc还是realloc函数分配的内存,都需要在使用完毕后进行释放,以避免内存泄漏。free函数的原型如下:
1void free(void* ptr);
free函数接受一个指向要释放的内存区域的指针作为参数.这样可以防止内存泄漏,即程序持续占用不再需要的内存,最终导致可用内存耗尽。在调用 free 函数后,之前指向该内存区域的指针不再有效。为了避免野指针(dangling pointer)的问题,通常建议将指针设置为 NULL,这样如果后续代码中不小心再次使用了这个指针,程序会因为尝试访问空指针而立即崩溃,而不是继续执行并可能导致未定义行为。
|