C语言:动态内存分配和内存操作

基于分段线性近似的Softmax硬件加速器设计 本文深入探讨了基于分段线性近似的Softmax硬件加速器设计。针对深度学习模型中Softmax函数在硬件实现时指数运算成本高昂的问题,提出用分段线性拟合替代传统泰勒展开,通过一次乘加操作高效完成计算,并详细分析了输入范围压缩、精度与硬件资源权衡、以及包含地址生成、参数查找、乘加计算和归一化的完整硬件架构。该方法在保证精度的同时,显著提升了AI边缘芯片的推理速度和能效。 阅读详情

要实现动态内存分配,需要使用标准C库提供的库函数,我们所说的动态内存分配,其实就是在堆区申请内存(此时的内存回收需要程序员自身来维护)

常用函数

malloc
  • 头文件:#include <stdlib.h>

  • 函数原型:

     void* malloc(size_t size);
  • 功能:分配指定字节数的内存到堆区,返回指向内存块首地址的指针。==内存内容未初始化(随机值)==。

  • 参数:

    • size:要分配的内存大小(字节),这里的size_t是数据类型 unsigned long int的别名。

  • 返回值:

    • 成功:返回内存指针(申请到的内存的首地址)

    • 失败:失败返回NULL

  • 示例:

    /*************************************************************************
      > File Name:    demo01.c
      > Author:       三道渊
      > Description:  
      > Created Time: 2025-07-31 09:31:49
     ************************************************************************/
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    ​
    int main(int argc, char *argv[])
    {
        // 新建一个指针变量,用来接收内存分配后返回的堆内存首地址
        int *p = malloc(sizeof(int)); // 4字节 这里尽量不使用常量
        
        // 对于指针的使用,一定要进行有效性校验,防止野指针
        if(p == NULL){ // 等价于 !p
            perror("内存申请失败!");// 这个函数用于向控制台输出异常信息
            return -1;
        }
        
        // malloc申请的内存空间,默认填充的是随机值,需要我们手动清零
        memset(p,0,sizeof(int)); // 对指定空间赋值0,支持批量赋值
        
        // 向这块空间赋值
        *p = 100;
        // 访问这块空间
        printf("%d\n", *p);
        
        // 堆空间使用完毕,一定要释放内存,此时需要程序员写代码释放
        free(p);
        
        // 如果指针对应的内存被释放,此时指针需要置空,防止产生空悬指针
        p = NULL;
        
        
        return 0;
    }
  • 注意事项:

    • 分配内存后需要手动初始化内存,推荐memset或calloc

    • 内存空间连续,不可越界访问

calloc
  • 头文件:#include <stdlib.h>

  • 函数原型:

    void* calloc(size_t nitems, size_t size);
  • 功能:动态分配内存,并初始化为0

  • 参数:

    • nitems:元素个数

    • size:每个元素的字节大小

  • 返回值:

    • 成功:返回内存指针(申请到的内存的首地址)

    • 失败:失败返回NULL

  • 示例:

    /*************************************************************************
      > File Name:    demo01.c
      > Author:       三道渊
      > Description:  
      > Created Time: 2025-07-31 09:50:17
     ************************************************************************/
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    ​
    #define LEN 5
    ​
    int main(int argc, char *argv[])
    {
        // 创建一个指针变量,用来接收内存分配后返回的堆内存地址
        int *arr = calloc(LEN, sizeof(int)); // 等价于 int *arr = malloc(LEN * sizeof(int); memset(arr,0,LEN * sizeof(int));
        
        // 对于指针的使用,一定要进行非空检验,防止野指针
        if (arr == NULL) // 等价于 !arr
        {
            perror("内存申请失败!");
            return -1;
        }
        
        // 使用for循环快速赋值
        for (int i = 0; i < LEN; i++)
        {
            if(i % 2 == 0) continue;
            arr[i] = (i+1)*10;
        }
        
        // 遍历数组
        int *p = arr;
        for (; p < arr + LEN; p++)
        {
            printf("%-6d", *p);
        }
        printf("\n");
        
        // 内存使用完毕,释放内存
        free(arr);
        // 置空,防止产生空悬指针
        arr = p = NULL;
        
        return 0;
    }
  • 使用场景:为数组分配内存时更安全高效。

realloc
  • 头文件:#include <stdlib.h>

  • 函数原型:

     void* realloc(void* ptr, size_t size);
  • 功能:调整已分配内存块的大小,可能迁移数据到新地址。扩容后,空余位置是随机值,需要手动清零。

  • 原理:

    • 当前内存空间后面的剩余空间足够扩容,就在原空间基础上进行扩容,返回原地址;

    • 当前内存空间后面的剩余空间不够扩容,会重新开辟一块空间,将原空间数据按顺序拷贝后,销毁原空间,返回新地址。扩容后的内存空间中的数据是随机的。需要手动清零。

  • 参数:

    • ptr:原内存指针(需要扩容的内存空间的指针,这个ptr的来源(malloc/calloc/realloc))

    • size:指定重新分配内存的大小(字节)

  • 返回值:

    • 成功:返回内存指针(申请到的内存的首地址)

    • 失败:失败返回NULL

  • 示例:

    /*************************************************************************
      > File Name:    demo03.c
      > Author:       三道渊
      > Description:  
      > Created Time: 2025-07-31 10:21:26
     ************************************************************************/
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    ​
    #define LEN 5
    #define NEW_LEN 8
    #define NEW_LEN_MIN 3
    ​
    int main(int argc, char *argv[])
    {
        // 创建一个指针,指向堆内存分配的内存空间
        int *arr = (int*)calloc(LEN, sizeof(int));
        
        // 指针的非空检验,防止野指针
        if (!arr){
            perror("内存申请失败!");
            return -1;
        }
        
        // 使用for循环赋值
        for (int i = 0; i < LEN; i++)
        {
            arr[i] = (i+1)*10;
        }
        
        // 遍历数组
        int *p = arr;
        for (; p < arr + LEN; p++) printf("%-6d", *p); printf("\n");
        
        // 扩容数组
        int *temp = (int*)realloc(arr, NEW_LEN * sizeof(int)); // 扩容出来的空间,默认是随机值
        // 非空校验,防止野指针
        if(!temp){
            perror("内存申请失败!");
            free(arr); // 扩容失败,回收原空间
            return -1;
        }
        
        // 更新数组指针
        arr = temp;
        // 对扩容部分清零
        memset(arr+LEN,0,(NEW_LEN - LEN) * sizeof(int));
        
        // 修改数组元素
        arr[7] = 666;
        
        // 遍历数组
        for (int i = 0; i < NEW_LEN; i++) printf("%-6d", *(arr+i)); printf("\n");
        
        // 缩容数组
        temp = (int*)realloc(arr, 0); // 此时,会回收掉内存,等价于free(arr);
        // 非空校验,防止野指针
        if(!temp){
            perror("内存申请失败!");
            return -1;
        }
        
        // 更新数组指针
        arr = temp;
    ​
        // 遍历数组
        for (int i = 0; i < NEW_LEN; i++) printf("%-6d", *(arr+i)); printf("\n");
        
        // 释放内存
        free(arr);
        arr = NULL;
        p = NULL;
        
        return 0;
    }
  • 注意事项:

    • 分配后需要手动初始化内存,推荐memset

    • 必须用临时变量接收返回值,避免直接覆盖原指针导致内存泄漏。

    • ==若size为0,等效于free(ptr)==

free
  • 头文件:#include <stdlib.h>

  • 函数原型:void free(void* ptr);

  • 功能:释放动态分配的内存。

  • 注意事项:

    • 只能释放一次,重复释放会导致程序崩溃。

    • 释放后应将指针置为NULL,避免野指针。

    • 栈内存由系统自动释放,无需手动free。

内存操作

我们对于内存操作需要依赖于string.h头文件中相关的库函数。

常用函数

内存填充
  • 头文件:#include <string.h>

  • 函数原型:

    void* memset(void* s, int c, size_t n);
  • 函数功能:将内存块s的前n个字节填充为c,一般用于初始化或者清零操作。

  • 参数说明:

    • s:目标内存首地址

    • c:填充值(以unsigned char形式处理(0~255))

    • n:填充字节数

  • 返回值:

    • 成功:返回s的指针

    • 失败:返回NULL

  • 注意事项:

    • 常用于动态初始化,c通常设置为0(清零)

    • 按字节填充,非整型初始化需要谨慎(如填充int数组时,0是安全的)

  • 案例:

    /*************************************************************************
      > File Name:    demo04.c
      > Author:       三道渊
      > Description:  
      > Created Time: 2025-07-31 11:03:23
     ************************************************************************/
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    ​
    #define LEN 4
    ​
    int main(int argc, char *argv[])
    {
        // 在堆内存申请4个int的连续空间
        int *p = (int*)malloc(LEN * sizeof(int));
        
        // 非空校验
        if (!p){
            perror("内存申请失败!");
            return -1;
        }
        
        // 初始化堆内存空间,填充0,我们也可以称作 清零操作
        memset(p, 0, LEN * sizeof(int));
        
        // 测试输出
        printf("%d,%d\n", p[1], *(p+1));
        
        // 释放内存
        free(p);  // 等价于 realloc(p,0);
        
        // 对指针置空,防止空悬指针
        p = NULL;
        
        return 0;
    }
内存拷贝
  • 头文件:#include <string.h>

  • 函数原型:

    • 源与目标内存无重叠时使用

      void* memcpy(void* dest, const void* src, size_t n);
    • 安全处理内存重叠

      void* memmove(void* dest, const void* src, size_t n);
  • 函数功能:将src的前n个字节拷贝到dest

  • 参数说明:

    • dest:目标内存首地址,支持指针偏移

    • src:源内存首地址,支持指针偏移

    • size_t n:拷贝的字节数

  • 返回值:

    • 成功:返回dest的首地址

    • 失败:返回NULL

  • 注意事项:

    • memmove能正确处理内存重叠,推荐优先使用

    • 确保目标内存足够大,避免溢出。

  • 示例:

    /*************************************************************************
      > File Name:    demo05.c
      > Author:       fpf
      > Description:  
      > Created Time: 2025-07-31 11:23:20
     ************************************************************************/
    #include <stdio.h>
    #include <string.h>
    ​
    int main(int argc, char *argv[])
    {
        // 准备两个数组,用来存储源和目标
        int src[4] = {11,22,33,44}; // 拷贝 22,33  从src+1开始,拷贝2个sizeof(int)
        int dest[6] = {111,222,333,444,555,666}; // 目的地 dest+1,拷贝后:111,22,33,444,555,666
        
        register int i = 0;
        printf("拷贝前:");
        for (i = 0; i < 6; i++) printf("%-6d", dest[i]);
        
        // 进行拷贝
        // memcpy(dest+1,src+1,2 * sizeof(int));
        memmove(dest+1, src+1, 2 * sizeof(int));
        
        printf("\n拷贝后:");
        for (i = 0; i < 6; i++) printf("%-6d", dest[i]); printf("\n");
        
        return 0;
    }

思考:什么是内存重叠?

内存比较
  • 头文件:#include <string.h>

  • 函数原型:

    int memcmp(const void* s1, const void* s2, size_t n);   
  • 函数功能:比较s1和s2的前n个字节

  • 返回值:

    • 0:内存内容相同

    • >0:s1中第一个不同字节大于s2

    • <0:s1中第一个不同字节小于s2

  • 注意事项:比较按字节进行,非字符串需确保长度一致(总字节数一致)。

  • 示例:

    /*************************************************************************
      > File Name:    demo06.c
      > Author:       三道渊
      > Description:  
      > Created Time: 2025-07-31 11:41:20
     ************************************************************************/
    #include <stdio.h>
    #include <string.h>
    
    int main(int argc, char *argv[])
    {
    	// 准备两个测试用的数组
    	int src[] = {111,22,33,44};
    	int dest[] = {111,22,10,44,555,666};
    	
    	// 进行比较
    	int result = memcmp(src, dest, 4 * sizeof(int)); 
    	printf("%d与%d的比较结果是%d\n",*src, *dest, result);
    	
    	return 0;
    }
内存查找
  • 头文件:#include <string.h>

  • 函数原型:

    • 正向查找,C语言标准库函数

      void* memchr(const void* s, int c, size_t n);
    • 逆向查找,这个不是C语言标准库函数,属于GNU扩展

      void* memrchr(const void* s, int c, size_t n);
  • 函数功能:在s的前n个字节中查找字符c

  • 返回值:

    • 成功:返回找到内容对应的地址

    • 失败:返回NULL

  • 注意事项:

    • memrchr是GNU扩展函数,需手动声明(只要不是C语言标准提供,编译的时候都需要手动声明或链接)

    • 查找单位为字节值,非整型数据需要注意内存布局

  • 示例:

    /*************************************************************************
      > File Name:    demo07.c
      > Author:       三道渊
      > Description:  
      > Created Time: 2025-07-31 14:24:24
     ************************************************************************/
    #include <stdio.h>
    #include <string.h>
    // #include <stddef.h>
    
    // 逆向查找函数 memrchr是GNU扩展函数,这个函数需要额外声明
    extern void* memrchr(const void*, int, size_t);
    
    //void* memrchr(const void* s, int c, size_t n) {
    //	const unsigned char* ptr = (const unsigned char*)s + n;
    //	while (n--) {
    //		if (*--ptr == (unsigned char)c) {
    //			return (void*)ptr;
    //		}
    //	}
    //	return NULL;
    //}
    
    int main(int argc, char *argv[])
    {
    	// 准备一个测试数组
    	char str[] = {'A','B','C','B'};
    	
    	// 查找字符 B
    	char* first = (char*)memchr(str, 'B', sizeof(str)); // 返回 低地址对应的字符地址
    	char* last  = (char*)memrchr(str, 'B', sizeof(str)); // GNU扩展函数,返回 高地址对应的字符地址
    	
    	printf("first=%p,last=%p\n", first, last);// first=0x7fff65a47875,last=0x7fff65a47877
    	printf("第1个B的位置:%ld\n", first - str);// 1
    	printf("最后1个B的位置:%ld\n", last - str);// 3
    	
    	return 0;
    }
开源的预测气象大模型与数据获取/可视化 「开源气象大模型与数据获取指南」摘要: 当前主流AI气象模型(如ECMWF的AIFS、DeepMind的GraphCast、华为Pangu等)主要基于ERA5/HRES数据训练。开源资源可通过ECMWF OpenData、GitHub仓库及Google Cloud获取,其中AIFS数据采用CCBY-4.0许可可商用,其他模型多有限制性许可。典型应用流程包括:1)通过Python包获取实时预报数据;2)加载预训练权重进行推理;3)使用xarray/cartopy或Zarr进行可视化。训练数据可从CDS下载ER 阅读详情

相关推荐

PyTorch版Unet训练后别只看loss:手把手教你计算并可视化多类别语义分割的mIoU(附完整代码)

本文详细介绍了在PyTorch中使用Unet模型进行多类别语义分割后,如何计算和可视化mIoU(mean Intersection over Union)以全面评估模型性能。通过完整的代码示例和实用技巧,帮助开发者从loss优化转向更精准的区域分割评估,特别适用于医学图像分析等关键场景。

weixin_30906185的博客 435

C语言-申请内存

C语言内存申请过程

qq_70851535的博客 3359

STM32异常与中断过程详解

1. 异常与中断概念引入 异常主要是指来自CPU内部的意外事件,比如执行了未定义指令、算术溢出、除零运算等发生在CPU内部的意外事件,这些异常的发生,会引起CPU运行相应的异常处理程序;中断一般来自硬件(如片上外设、外部I/O输入等)发生的事件,当这些硬件产生中断信号时,CPU会暂停当前运行的程序,转而去处理相关硬件的中断服务程序。但无论是异常还是中断,都会引起程序执行偏离正常的流程,转而去执行异常/中断的处理函数。 下面对异常和中断的介绍,如果中断信号的产生原因来自CPU内部,则称之为异常;如果中断信号来

luobeihai的博客 1万+

C语言中堆内存的申请和使用

C语言中堆内存的申请和使用

qq_58116869的博客 3355

【DaVinci Developer专题】-8-创建一个枚举Enum ADT(Application Data Type)

目录 1 创建一个枚举Value ADT(Application Data Type) 1.1 命名application data type 1.2 创建一个computation method计算方法属性 1.3 创建一个Contraint约束条件属性 2 创建了一个新的Type Mapping Sets 3 创建了一个S/R Port Interface 4 SWC引用Type Mapping set 5 导入CFG生成代码的总结 6 结尾 <--返回「实战篇」博文-总目录-

「汽车电子助手」的博客 2292

【C语言】字符常量详解

字符常量是C语言中处理字符数据的重要工具。通过单引号括起一个字符,我们可以方便地使用字符常量进行字符判断、字符运算和字符串处理等操作。理解字符常量的表示方法、使用场景和ASCII码对应关系,对于编写高效的C语言程序至关重要。

LuckiBit 5019

牛客练习赛17 -- c题-操作数(快速幂或者排列组合)

链接:https://www.nowcoder.com/acm/contest/109/C来源:牛客网给定长度为n的数组a,定义一次操作为: 1. 算出长度为n的数组s,使得si= (a[1] + a[2] + ... + a[i]) mod 1,000,000,007; 2. 执行a = s; 现在问k次操作以后a长什么样。输入描述:第一行两个整数n,k(1 &lt;= n &lt;= 2000...

blaze_jack 636

12、无人机系统的建模与仿真

本文深入探讨了无人机系统的建模与仿真技术,涵盖其发展需求、历史演变、动力学建模方法、常用参考框架与状态变量表示,并分析了在控制系统设计、操作员培训和子系统测试中的关键应用。文章还介绍了不同类型无人机(固定翼、旋翼、混合翼)在建模与仿真中的差异,提出了多学科融合、高精度实时仿真及VR/AR技术等未来发展趋势,并给出了实际建模与仿真的标准操作流程,为无人机系统的设计与优化提供了全面的技术支持与展望。

websocket5live的博客 196

【C/C++】基础知识之动态申请内存空间new-delete

使用malloc将堆区创建一个存储空间并把局部变量存放进去 在C++中,有一种全新的方式用来在堆区动态申请内存空间——new和delete关键字

努力让自己的能力配得上梦想. 4330

[ vulhub漏洞复现篇 ] ActiveMQ反序列化漏洞复现(CVE-2015-5254)

Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务、集群、Spring Framework等。由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行。Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,该漏洞源于程序没有限制可在代理中序列化的类。......

qq_51577576的博客 4444

使用Python爬虫抓取政府网站政务信息:公告、通知的自动化抓取与分析

通过结合Requests、BeautifulSoup、Selenium等技术,你能够高效地抓取政府网站的数据,并通过MySQL存储与Pandas分析这些数据。通过自动化手段抓取这些信息,不仅可以提高数据收集的效率,还能够实时获取最新的政务动态,为政策研究、舆情分析等提供宝贵数据。我们将通过Python的Requests、BeautifulSoup、Selenium等工具,结合最新的技术实现一个完整的爬虫系统,帮助你轻松抓取并分析政务信息。通过爬虫,我们可以自动化地从指定网站上抓取公告、新闻、通知等信息。

2201_76125261的博客 1907

BioSIM抗人IL-17C抗体SIM0543:赋能炎症与自身免疫性疾病研究

BioSIM anti-Human IL-17C Antibody (MOR106 Biosimilar) 以其卓越的品质、广泛的适用性和便捷的服务,正成为越来越多科研工作者的首选。这一过程不仅提升了抗体的稳定性和活性,也减少了非特异性结合的风险,从而提高实验结果的可靠性和可重复性。如果您正在寻找一款高性能、高稳定性的 IL-17C 抗体产品,不妨考虑 BioSIM anti-Human IL-17C Antibody (MOR106 Biosimilar),它将是您科研旅程中的得力助手。

2501_92529723的博客 2155

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C 语言 - 标准内存分配函数

我们在 C 语言中常见的内存操作函数有:malloc、free、calloc、realloc 一、malloc 函数原型:void *malloc(unsigned int num_bytes) 功能:用于动态分配内存,malloc 向系统申请分配指定 num_bytes 个字节的内存空间 头文件:malloc.h 或 stdlib.h 如:int* p =(int *) malloc(size...

devilzcl的博客 427

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C语言-动态内存管理

前言: 简单记录一下,内存管理函数 为什么使用动态内存呢? 简单理解就是可以最大限度调用内存 用多少生成多少,不用时就释放 而静止内存不能释放 动态可避免运行大程序导致内存溢出 C 语言为内存的分配和管理提供了几个函数: 头文件:<stdlib.h> 注意:void * 类型表示未确定类型的指针 1.malloc() 用法 分配一块大小为 num 的内存空间 #include <stdio.h> #include <stdlib.h..

m0_61879882的博客 565

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【回顾C语言】动态内存开辟

在函数内部开辟空间后最好在函数内部释放,若指针是一个局部变量,存储在栈区中,那么指针出了函数作用域就会被销毁,所以释放不到该内存,但将指针设为静态变量(static)就可以,因为开辟的空间在堆区,不会随着函数的作用域而销毁。这是最容易犯错的操作,当我们进行动态内存开辟后,往往会默认为开辟成功,一旦开辟失败,动态内存会返回空指针,那么我们就是在对空指针进行操作,无论是对地址的访问还是对空指针的操作都是非法操作。若改变指针的位置,则释放的是改变后的指针指向的后面的空间,前面的空间将丢失,造成错误。

WBMcurry的博客 300

动态内存函数

动态内存函数

Ztt19990421的博客 164

C语言动态内存管理

动态内存分配管理的是堆区的内存,相对于栈区开辟有着大小可变,在运行时根据需要开辟的优点。

huangdou510的博客 304

C语言—知识点—动态内存开辟

malloc,calloc,realloc

xiao3399的博客 280

C语言基础(动态内存分配)

函数功能头文件初始化规则malloc(n)申请n字节堆内存stdlib.h未初始化(随机值)申请m个n字节的连续内存stdlib.h自动初始化为0调整已分配内存大小stdlib.h新增部分为随机值free§释放p指向的堆内存stdlib.h仅释放使用权,不修改指针。

qq_Lntano的博客 351

动态内存函数(c语言)

1.malloc函数 c语言提供了一个动态内存开辟的函数:void*malloc(size_t size) 这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针 如果开辟成功,返回一个指向开辟好空间的指针,如果开辟失败,返回NULL,因此malloc的返回值一定要做检查。由于返回值是void*,所以malloc函数并不知道开辟的空间类型是什么,要有使用者来决定。 如果参数size为0,malloc的行为是标准是未定义的,取决于编译器。 2.free函数(用来释放动态开辟的内存)void*

HBINen的博客 552

C语言之内存分配例题详解

1、C中内存分为四个区  栈:用来存放函数的形参和函数内的局部变量。由编译器分配空间,在函数执行完后由编译器自动释放。  堆:用来存放由动态分配函数(如malloc)分配的空间。是由程序员自己手动分配的,并且必须由程序员使用free释放。如果忘记用free释放,会导致所分配的空间一  直占着不放,导致内存泄露。  全局:用来存放全局变量和静态变量。存在于程序的整个运行期间,是由编译器分配...

weixin_34252090的博客 202

动态内存分配函数的使用/ malloc free calloc realloc

动态内存分配: 时间:2021年4月8日12:56:31 动态内存分配函数:malloc \ free \ calloc \ realloc /* malloc 是动态申请一块连续可用的内存空间,并返回指向这块空间的指针,如果开辟失败,则返回空指针。free 是释放和回收内存空间。 malloc 的返回值一定要做检查,申请完的空间,要用free 函数释放掉,它俩成对使用。否则影响后面的程序使用该内存空间。 */ //常见的动态内存错误。 //#include<string.h> //打印错误的

m0_51553630的博客 220

C语言的动态分配内存

C语言的动态分配内存 静态内存分配 ​ 定义:在C语言的程序空间中,可知代码区、常量区、全局数据区的内存在程序启动时就已经分配好了,这些地址空间大小固定,不能由程序分配和释放,只能等程序运行结束由系统来进行回收。 动态内存分配 ​ 定义:栈区和堆区的内存在程序运行期间可以根据实际需求来分配和释放,不用在 程序刚启动时就分配内存。 栈和堆的区别 栈区内存由系统分配和释放;堆区内存由程序员掌控。 程...

Cchengyoyoy的博客 633

【C语言进阶篇】动态内存分配和数组的动态内存分配

本文主要介绍了C语言中常用的内存函数和数组的动态内存分配,并稍微提了一嘴柔性数组。动态内存分配是C语言中十分重要的一环,其中对二维数组的动态内存分配是个难点,需要多思考。

Ye_Ming_OUC的博客 3万+

C语言动态内存分配详解

文章目录前言一、为什么存在动态内存分配1、已掌握的内存开辟方式2、上述开辟空间方式的特点3、为什么存在动态内存分配二、动态内存函数的介绍1、malloc2、free3、calloc4、realloc三、常见的动态内存错误四、几个经典的笔试题五、柔性数组总结 前言 自从前两次博客写完以后,感觉对于我本人来说,收获很大,尤其是将学过的知识再度温习一遍,感觉基础扎实了很多,所以就养成了一个习惯,每学完一个模块,都会写一篇博客,不仅仅是写个我自己的,也是想通过这篇博客,与大家分享一些我的见解。本来周四就学完了动态内

WZRbeliever的博客 8415

【C语言】动态内存的分配

动态内存的分配就那么回事儿!

C、Java知识分享 1万+
上一篇: C语言:二级指针及void与void*的区别
下一篇: C语言:构造类型
三道渊
博客等级 码龄3年 118粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值