首页 > 其他分享 >malloc讲解(c基础)

malloc讲解(c基础)

时间:2024-11-30 22:34:24浏览次数:6  
标签:malloc int 基础 ptr 内存 讲解 NULL 分配

  1. 函数功能与用途

    • malloc是 C 语言中的一个内存分配函数,用于在程序运行时动态地分配一块连续的内存空间。这与静态内存分配(如定义数组时指定固定大小)不同,动态分配允许程序根据实际需求在运行过程中灵活地获取所需的内存。
    • 例如,当你在编写一个程序,需要存储用户输入的一组数据,但在编写程序时无法确定数据的数量,这时就可以使用malloc来根据用户输入的数量动态分配足够的内存来存储这些数据。
  2. 函数参数和返回值

    • 参数
      • malloc函数接受一个参数size,它是size_t类型。size_t是一个无符号整数类型,用于表示内存大小,这个参数指定了你想要分配的内存字节数。例如,如果你想分配足够存储 10 个int类型数据的内存,因为int类型在常见系统中占 4 个字节,所以你应该传递10* sizeof(int)作为参数。
    • 返回值
      • 如果内存分配成功,malloc会返回一个指向所分配内存块起始地址的void *类型指针。这个指针可以被转换为任何其他类型的指针,以适应不同的数据存储需求。例如,如果你分配的内存是用来存储int类型数据的,你可以将返回的指针转换为int *类型。
      • 如果内存分配失败(通常是因为没有足够的可用内存),malloc返回NULL。所以在使用malloc分配内存后,一定要检查返回值是否为NULL,以避免后续对空指针进行操作导致程序崩溃。
  3. 使用示例

    • 以下是一个简单的示例,展示如何使用malloc来分配一个包含 5 个int类型元素的数组:
      • 隐藏过程

         

        c

        复制

        #include <stdio.h>
        #include <stdlib.h>
        
        int main() {
            int *ptr;
            // 分配足够存储5个整数的内存
            ptr = (int *)malloc(5 * sizeof(int));
            if (ptr == NULL) {
                // 内存分配失败
                printf("Memory allocation failed.\n");
                return 1;
            }
        
            // 使用分配的内存
            for (int i = 0; i < 5; i++) {
                ptr[i] = i + 1;
            }
        
            // 打印分配内存中的数据
            for (int i = 0; i < 5; i++) {
                printf("%d ", ptr[i]);
            }
        
            // 释放内存
            free(ptr);
        
            return 0;
        }
        

收起

plaintext

复制

   - 在这个示例中:
     - 首先通过`malloc(5 * sizeof(int))`分配了能够存储5个整数的内存块。注意这里将`malloc`返回的`void *`类型指针转换为`int *`类型,因为我们要将这块内存用于存储`int`类型的数据。
     - 然后检查`ptr`是否为`NULL`,以确定内存是否分配成功。如果`ptr`为`NULL`,则打印错误信息并结束程序。
     - 接着使用循环对分配的内存进行赋值操作,将1到5分别赋给数组元素。
     - 最后使用`free`函数释放了之前通过`malloc`分配的内存。这一步非常重要,因为如果不释放动态分配的内存,会导致内存泄漏,即程序占用的内存不断增加,最终可能耗尽系统资源。

4. **注意事项**
   - **内存释放**:
     - 必须使用`free`函数来释放通过`malloc`分配的内存。而且要确保`free`函数的参数是之前`malloc`返回的有效指针,不能对同一块内存进行多次释放,也不能释放不是通过`malloc`(或相关的`calloc`、`realloc`函数)分配的内存。
   - **错误处理**:
     - 由于`malloc`可能会因为内存不足等原因导致分配失败,所以在使用`malloc`后,应该检查返回值是否为`NULL`,并进行相应的错误处理,如打印错误信息、释放已分配的其他资源并安全地终止程序或采取其他恢复策略。
   - **初始化**:
     - `malloc`分配的内存是未初始化的,内存中的数据是随机的。如果需要将内存初始化为特定的值,可以使用`calloc`函数(`calloc`会将分配的内存初始化为0)或者在使用`malloc`后自行初始化。例如,在上面的示例中,如果希望在分配内存后将所有元素初始化为0,可以在循环赋值之前添加一个循环来初始化:
       - ```c
         for (int i = 0; i < 5; i++) {
             ptr[i] = 0;
         }

标签:malloc,int,基础,ptr,内存,讲解,NULL,分配
From: https://blog.csdn.net/lb3636363636/article/details/144147277

相关文章

  • LangChain大模型AI应用开发实践:从基础到实战【文末好书推荐】
    《LangChain大模型AI应用开发实践》是一个围绕使用LangChain进行大规模AI应用开发的主题,重点介绍如何通过LangChain框架和相关技术,构建和优化AI应用。LangChain是一个面向大语言模型(LLM)开发的开源框架,特别适用于与多个外部工具、API及数据源的集成。它帮助开发者通过无缝的......
  • Python入门基础语法之运算符类型和语法
    运算符类型和语法运算符基本概念需注意,虽然python中无常量,但人为规定,在运行过程中值不能改变的为常量,要全部大写。操作数:参与运算的变量或者常量或具体的数值操作符:将参与运算的量连接起来的符号表达式:由操作数和操作符构成且符合python语法规范的式子,不同的操作符可以......
  • BeautifulSoup(bs4)细致讲解
    BeautifulSoup(bs4)BeautifulSoup是python的一个库,最主要的功能是从网页爬取数据,官方是这样解释的:BeautifulSoup提供一些简单,python式函数来处理导航,搜索,修改分析树等功能,其是一个工具库,通过解析文档为用户提供需要抓取的数据,因为简单,所有不需要多少代码就可以写出一......
  • 【查询基础】.NET开源 ORM 框架 SqlSugar 系列
     .NET开源ORM框架SqlSugar系列【开篇】.NET开源ORM框架SqlSugar系列【入门必看】.NET开源ORM框架SqlSugar系列【实体配置】.NET开源ORM框架SqlSugar系列【DbFirst】.NET开源ORM框架SqlSugar系列【CodeFirst】.NET开源ORM框架SqlSugar系列【数据事......
  • 【docker】Dockerfile指令讲解,与企业案例应用
    Dockerfile简介Dockerfile是一个文本文件,包含了构建Docker镜像所需的所有命令。通过执行dockerbuild命令,Docker会按照Dockerfile中的指令一步步构建出镜像。Dockerfile基本结构一个简单的Dockerfile可能包含以下内容:FROMubuntu:20.04LABELmaintainer="y......
  • 学期:2024-2025-1 学号:20241303 《计算机基础与程序设计》第10周学习总结
    作业信息这个作业属于哪个课程<班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2024-2025-1计算机基础与程序设计第十周作业)这个作业的目标<写上具体方面>计算机科学概论(第七版)第12,13,14章并完成云班课测试,《C语言程序设计......
  • mysql基础11.28
    系统数据库information-schema信息数据库mysql核心数据库performance_schema存储数据库服务器的性能参数sakila存放数据库样本sys系统的元数据信息world提供关于城市,国家和语言的相关信息创建数据库:createdatabase或者createschemacharacterset:指定数据库的字符......
  • Python入门 - 编程基础
    代码与文本No.1输入和输出概念:输入:计算机【收到】来自外界的数据传递·输出:计算机对外界【发出】的数据传递print:理解为“打印”,能让计算机在屏幕上输出内容语法:print("Helloworld")print语法包含四个部分:指令名print;指令附带的括号();标记文本的双引号”;引用的文本......
  • 2024-2025-1学号20241309《计算机基础与程序设计》第十周学习总结
    作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里2024-2025-1计算机基础与程序设计第十周作业这个作业的目标|作业正文|2024-2025-1学号20241309《计算机基础与程序设计》第十周学习总结教材学习内容总结《计算机科学概论》......
  • Java基础语法练习题11
    进一步深入算法思维!习题:打出实心金字塔和空心金字塔本人代码心得:这题所用时间大概25分钟,总的来说就是找规律。publicclassStars{publicstaticvoidmain(String[]args){//实心金字塔intm=5;for(inti=1;i<=m;i++){......