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