在开发过程中我们经常要动态地进行内存分配,而内存的管理是一个重要的问题。在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
函数失败的情况下,我们需要手动释放原来的指针,以避免内存泄漏。
标签:malloc,int,realloc,用法,详解,内存,ptr,指针
From: https://www.cnblogs.com/Arthurian/p/16653160.html