| 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,这样如果后续代码中不小心再次使用了这个指针,程序会因为尝试访问空指针而立即崩溃,而不是继续执行并可能导致未定义行为。
 
 
 |