首页 > 其他分享 >realloc() 用法详解

realloc() 用法详解

时间:2023-09-11 23:25:49浏览次数:49  
标签:malloc int realloc 用法 详解 内存 ptr 指针

在开发过程中我们经常要动态地进行内存分配,而内存的管理是一个重要的问题。在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

相关文章

  • Sentinel 工作原理详解
    1综述Sentinel所有资源都对应:一个资源名称一个EntryEntry可通过:对主流框架适配自动创建也可通过注解的方式或调API显式创建每个Entry创建同时也会创建一系列功能插槽(slotchain)。这些插槽有不同职责如:NodeSelectorSlot负责收集资源的路径,并将这些资源的......
  • 【愚公系列】2023年09月 WPF控件专题 Canvas控件详解
    (文章目录)前言WPF控件是WindowsPresentationFoundation(WPF)中的基本用户界面元素。它们是可视化对象,可以用来创建各种用户界面。WPF控件可以分为两类:原生控件和自定义控件。原生控件是由Microsoft提供的内置控件,如Button、TextBox、Label、ComboBox等。这些控件都是WPF中常见......
  • Unity 性能优化Shader分析处理函数:ShaderUtil.GetShaderGlobalKeywords用法
    Unity性能优化Shader分析处理函数:ShaderUtil.GetShaderGlobalKeywords用法点击封面跳转下载页面简介Unity性能优化Shader分析处理函数:ShaderUtil.GetShaderGlobalKeywords用法在Unity开发中,性能优化是一个非常重要的方面。一个常见的性能优化技巧是使用ShaderUtil.GetSha......
  • Unity 性能优化Shader分析处理函数:ShaderUtil.GetShaderGlobalKeywords用法
    Unity性能优化Shader分析处理函数:ShaderUtil.GetShaderGlobalKeywords用法点击封面跳转下载页面简介Unity性能优化Shader分析处理函数:ShaderUtil.GetShaderGlobalKeywords用法在Unity开发中,性能优化是一个非常重要的方面。一个常见的性能优化技巧是使用ShaderUtil.GetSh......
  • 你真的掌握了python列表用法吗
       列表是python语言中最常用的的数据类型,理解和运用好列表用法对开发工作至关重要。下面列举部分代码,请对照输出结果检验一下结合使用print语句操作列表数据的熟练程度吧。   使用print语句输出列表内容代码li=['我们','中国人民','秦国','赵国']print('例一:#编号......
  • tomcat出现Java heap space / PermGen space解决方法(详解)
    使用Java程序从数据库中查询大量的数据时出现异常:java.lang.OutOfMemoryError:Javaheapspace在JVM中如果98%的时间是用于GC且可用的Heapsize不足2%的时候将抛出此异常信息。JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap......
  • 详解Java多线程编程中线程的启动、中断或终止操作
    ​在Java中start和tun方法可用被用来启动线程,而用interrupt方法来中断或终止线程,以下我们就来详解Java多线程编程中线程的启动、中断或终止操作 线程启动: 1.start()和run()的区别说明start():它的作用是启动一个新线程,新线程会执行相应的run()方法。start()不能被......
  • scrapy 用法
    1、创建scrapy项目:在终端Terminal运行命令:scrapystartproject【项目名称】scrapystartprojectlfj_pro PSD:\pythonProject8_scrapy>scrapystartprojectlfj_proNewScrapyproject'lfj_pro',usingtemplatedirectory'C:\Users\Administrator\AppData......
  • swift switch case 的复杂用法
    Swift中的 switch 语句非常灵活,可以用于处理各种复杂的条件。下面是一些 switch 语句的复杂用法:匹配值和范围:你可以使用 case 子句来匹配特定的值,也可以匹配一个值范围。例如:swiftletnumber=3switchnumber{case1:print("Numberis1")case2,3,4:prin......
  • 【愚公系列】2023年09月 WPF控件专题 DockPanel控件详解
    (文章目录)前言WPF控件是WindowsPresentationFoundation(WPF)中的基本用户界面元素。它们是可视化对象,可以用来创建各种用户界面。WPF控件可以分为两类:原生控件和自定义控件。原生控件是由Microsoft提供的内置控件,如Button、TextBox、Label、ComboBox等。这些控件都是WPF中常见......