打印
[其他]

内存相关的realloc函数和free函数

[复制链接]
939|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
OKAKAKO|  楼主 | 2024-6-18 12:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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,这样如果后续代码中不小心再次使用了这个指针,程序会因为尝试访问空指针而立即崩溃,而不是继续执行并可能导致未定义行为。

1free(p);  
2p = NULL;


使用特权

评论回复
评论
forgot 2024-6-25 10:07 回复TA
技术贴 

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

168

主题

1248

帖子

3

粉丝