realloc() 用法详解

发布时间 2023-09-11 23:06:48作者: Arthurian

在开发过程中我们经常要动态地进行内存分配,而内存的管理是一个重要的问题。在C语言中,内存分为四个区域:堆区,栈区,全局/静态存储区和常量存储区。其中,堆区用于动态内存分配。在C标准库中,主要有两个函数用于动态内存分配,分别是malloc()和realloc()。

malloc()函数

malloc()函数在堆内存中动态分配一块指定大小的连续内存。它的原型是void* malloc(size_t size);,其中size_t是一个无符号整型数,表示要分配的内存的字节数。malloc()返回一个指向分配的内存的指针,如果分配失败,则返回NULL。

例如,下面的代码会分配100个字节的内存:

int *ptr = (int*)malloc(100 * sizeof(int));

在这个例子中,我们分配了足够存储100个整数的内存,然后返回一个指向这块内存的指针。这块内存可以通过ptr来访问。注意,malloc()返回的是void类型的指针,所以在使用前需要将其转换为适当的类型。

realloc()函数

realloc()函数用于调整已分配内存的大小。它的原型是void* realloc(void* ptr, size_t size);,其中ptr是要调整大小的内存块的指针,size是新的内存块大小(以字节为单位)。如果size大于原始内存块的大小,新内存将被添加到原始内存的后面,并返回指向新内存的指针。如果size小于原始内存块的大小,多余的内存将被丢弃。如果realloc()无法调整内存大小,它将返回NULL。

例如,下面的代码将把之前分配的内存块的大小调整为200个字节:

ptr = (int*)realloc(ptr, 200 * sizeof(int));

 

在这个例子中,我们尝试将之前分配的内存块的大小调整为200个字节。如果成功,realloc()将返回一个指向新的内存块的指针,否则返回NULL。注意,realloc()可能会改变原始内存块的位置,所以我们应该总是使用一个新的指针来接收realloc()的返回值。

注意事项

1、记得释放内存

在使用malloc()或realloc()分配的内存块之后,一定要记得使用free()函数释放这些内存,否则会导致内存泄漏。

2、记得检查返回值

当调用malloc()或realloc()时,如果内存分配失败,它们将返回NULL。因此,我们总是应该检查这些函数的返回值,以确保内存分配成功。

3、调用realloc之前不需要手动free前面用malloc申请的内容。

当你使用realloc函数时,它会自动处理原来指针的释放,你不需要手动释放原来的指针。realloc函数会尝试在原来的内存块上进行调整,如果原来的内存块不够大,它会另外寻找一块足够大的内存块,并把原来的数据复制到新的内存块上。如果realloc函数成功地调整了内存块的大小,它将返回一个指向新的内存块的指针,你可以使用这个指针来访问新的内存块。而原来的指针将被自动释放,不再有效。

下面是一个完整的使用realloc函数的例子:

 1 #include <stdio.h>  
 2 #include <stdlib.h>  
 3   
 4 int main() {  
 5     int *ptr = (int *)malloc(5 * sizeof(int)); // 分配5个整数的内存空间  
 6     if (ptr == NULL) {  
 7         printf("Memory allocation failed.\n");  
 8         return 1;  
 9     }  
10   
11     // 写入数据到内存块  
12     for (int i = 0; i < 5; i++) {  
13         ptr[i] = i + 1;  
14     }  
15   
16     // 调整内存块大小为10个整数  
17     int *new_ptr = (int *)realloc(ptr, 10 * sizeof(int));  
18     if (new_ptr == NULL) {  
19         printf("Memory reallocation failed.\n");  
20         free(ptr); // 如果realloc失败,需要手动释放原来的指针  
21         return 1;  
22     }  
23     ptr = new_ptr; // 使用新的指针访问内存块  
24   
25     // 写入新的数据到内存块  
26     for (int i = 5; i < 10; i++) {  
27         ptr[i] = i + 1;  
28     }  
29   
30     // 输出内存块中的数据  
31     for (int i = 0; i < 10; i++) {  
32         printf("%d ", ptr[i]);  
33     }  
34     printf("\n");  
35   
36     free(ptr); // 释放内存块  
37     return 0;  
38 }
在这个例子中,我们首先使用malloc函数分配了一个大小为5个整数的内存块,并将数据写入到该内存块中。然后,我们使用realloc函数将内存块的大小调整为10个整数,并使用新的指针访问新的内存块。在调整内存块大小后,我们又写入了新的数据到内存块中,并输出整个内存块中的数据。最后,我们释放了内存块。请注意,在realloc函数失败的情况下,我们需要手动释放原来的指针,以避免内存泄漏。