动态内存管理学习分享

【小黑嵌入式系统第十五课】μC OS-III程序设计基础(四)——消息队列(工作方式&数据通信&生产者消费者模型) ANSI C中,可以使用malloc()和free()两个函数来动态分配内存,在嵌入式系统中,它们一般也是可用的,但并不适合。如图为被两个函数分配过的内存区。为了避免上面的问题,μC/OS-III自己设计了一套动态内存分配系统。μC/OS-III的动态内存分配是以块为单位分配的,一次只能分配一个块,块的大小可以由用户来定义。μC/OS-III的动态内存管理是数据队列的绝佳伴侣,配合使用异常方便。自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。 阅读详情


在这里插入图片描述


1. 为什么存在动态内存分配

我们常见的内存开辟方式有:

int val = 20;///在栈上开辟4个字节空间
char arr[10] = { 0 };//在栈上开辟连续10个字节的连续空间

但上述开辟空间的方式有两个特点:

  1. 开辟的空间大小是固定的。
  2. 数组在申明的时候,必须指定数组的长度,它所需的内存在编译时分配。

但是对于空间的需求,不仅仅是上述的情况。有时我们需要的空间大小在运行时才能知道。
那数组在编译时开辟空间的方式就不能满足需求了!!
这时就只能试试动态内存开辟了。


2. 动态内存函数的介绍

2.1 malloc和free

C语言提供了一个动态内存开辟的函数:

void* malloc (size_t size);

这个函数可以向内存申请一块连续可用的空间,并返回指向这块空间的指针。

  1. 如果开辟成功,则返回一个指向开辟好空间的指针。

  2. 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。

  3. 返回值的类型是void*,所以malloc函数并不知道开辟内存空间的类型,具体在使用的时候使用者自己来决定。

  4. 如果参数size为0,malloc的行为是标准未定义的,取决于编译器。

C语言提供了另一个函数free,专门是用来做动态内存的释放和回收的,函数原型如下:

void free (void* ptr);

1. 如果参数ptr指向的空间不是内存开辟的,那么free函数的行为是未定义的。
2. 如果参数ptr是NULL指针,则函数什么事都不做。

malloc和free都声明在stdlib.h头文件中。
Tips:

  • malloc函数申请到空间后,直接返回这块空间的起始地址,并不会初始化空间的内容。
  • malloc函数申请的内存空间,当程序退出时会还给操作系统。但当程序没有退出时,动态申请的空间不会主动释放。需要使用free函数来释放。

2.1.1 实例

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int* p = (int*)malloc(40);
	if (p == NULL)//检查是否开辟成功
	{
		perror("malloc");//打印错误码信息
		return 1;
	}

	//内存申请开辟成功
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", *(p + i));
	}

	//释放回收申请空间
	free(p);
	p = NULL;
	return 0;
}

运行结果:
在这里插入图片描述


2.2 calloc

C语言还提供了一个叫calloc,calloc函数也用来动态内存分配。原型如下:

void* calloc (size_t num, size_t size);
  • 函数的功能是为num个大小为=ize的元素开辟一块空间,并且把空间的每一个字节初始化为0。
  • 与函数malloc的区别只在于calloc在返回地址之前会将申请到的空间的每个字节初始化为0。

2.2.1 实例

int main()
{
	int* p = (int*)calloc(10, sizeof(int));
	if (p == NULL)
	{
		perror("calloc");
		return 1;
	}
	for (int i = 0; i < 10; i++)
	{
		printf("%d:%p\n", p[i],&p[i]);
	}
	
	return 0;
}

结果:

在这里插入图片描述


2.3 realloc

realloc函数的出现让动态内存管理更加灵活。
过去有时我们会发现申请的空间太小了,有时候我们又会觉得申请的空间太大了,那为了开辟合理内存,我们一定会对内存的大小做灵活的调整。那么realloc函数就可以做到对动态开辟内存的大小进行调整。
函数原型如下:

void* realloc (void* ptr, size_t size);
  • ptr是要调整的内存地址,size为调整后的新大小。
  • 返回值为调整之后的内存起始位置。
  • realloc在调整内存空间时会存在两种情况:
    。在原有空间之后有足够大小的空间:要扩展内存之后直接追加空间,原来空间的数据不发生变化。
    。原有空间之后没有足够大的空间:在栈空间上另找一个合适大小的连续空间重新开辟一块内存空间,并将旧空间中的数据拷贝到新的空间,并释放旧空间,返回新空间的起始位置。

3. 常见的动态内存错误

3.1 对NULL指针的解引用操作

int main()
{
	int* p = (int*)malloc(40);
	//没有进行判断是否开辟成功
	//若开辟失败,则p为空指针。
	//对空指针进行解引用操作是非法的
	*p = 20;
	free(p);
	return 0;
}

3.2 对动态开辟空间的越界访问

int main()
{
	int* p = (int*)malloc(40);//开辟10字节空间
	if (p == NULL)
	{
		perror("malloc");
		return 1;
	}
	for (int i = 0; i <= 10; i++)//越界访问
	{
		*(p + i) = i + 1;
	}
	free(p);
	p = NULL;
	return 0;
}

3.3 对非动态开辟内存使用free释放

int main()
{
	int a = 10;
	int* p = &a;
	free(p);//err
	return 0;
}

后果:
对非动态开辟内存释放会导致内存泄漏,如果内存泄漏发生在长时间运行的程序中,可能会导致系统资源耗尽,使整个系统变得不稳定。


3.4 使用free释放一块动态开辟内存的一部分

int main()//err
{
	int* p = (int*)malloc(40);
	if (p == NULL)
	{
		perror("malloc");
		return 1;
	}
	for (int i = 0; i < 10; i++)
	{
		*p = i + 1;
		p++;//p在不断向后移动
	}

	//释放
	free(p);//释放时,只是放了一小部分
	p = NULL;
	return 0;
}

后果:
释放部分内存可能会导致内存损坏,因为该内存可能被后续的内存分配操作重叠使用。这可能导致程序崩溃、数据损坏或其他不可预测的行为。

3.5 对一块动态内存进行多次释放

int main()
{
	int* p = (int*)malloc(40);
	if (p == NULL)
	{
		perror("malloc");
		return 1;
	}

	//释放
	free(p);
	p = NULL;

	free(p);//err,多次释放

	return 0;
}

后果:
1.数据损坏:重复释放内存可能导致未定义的行为,包括数据损坏。当重复释放内存后,其他变量可能会被覆盖或改变,导致程序出现逻辑错误或不可预测的行为。
2.安全漏洞:重复释放内存可能导致安全漏洞。恶意攻击者可以利用重复释放内存的漏洞来执行代码注入、缓冲区溢出等攻击。

3.6 开辟动态内存忘记释放(内存泄漏)

在前面已经多次提及这个问题,在此就不再过多介绍了。


4 C/C++程序的内存开辟

在这里插入图片描述


C/C++程序内存分配的几个区域:

①:栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元会自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。栈区主要存放运算函数而分配的局部变量、函数参数、返回数据、返回地址等。
②:堆区(heap):一般有程序员分配释放,若程序员不释放,程序结束时可能由QS回收。分配方式类似于链表。
③:数据段(静态区)(stack)存放全局变量、静态数据。程序结束后由系统释放。
④:代码段:存放函数体(类成员函数和全局变量)的二进制代码。


同时也能解释为什么static修饰局部变量导致其生命周期变长。

实际上普通的局部变量是在栈区分配空间的,栈区的特点是上面创建的变量出作用于后销毁。
但是被static修饰的局部变量存放在数据段(静态区),数据段上的特点是在上面创建的变量,直到按程序结束才销毁。
所以生命周期变长。


5 柔性数组

也许你没听过柔性数组(flexible array) 数组这个概念,但它是的确存在的。
C99中,结构中的最后一个元素允许是未知大小的数组,这就叫做 【柔性数组] 的成员。

例如:

//在C语言中,柔性数组有两种声明形式,具体具体取决与编译器:
//第一种声明方式
struct S
{
	int i;
	int arr[];//柔性数组,前面至少有一个成员
};

//第二种声明方式
struct S
{
	int i;
	int arr[0];//柔性数组
};

5.1 柔性数组的特点

  • 结构中的柔性数组成员前面必须至少有一个成员。
  • sizeof返回的这种结构大小不包括柔性数组的内存。
  • 包含柔性数组成员的结构用malloc函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。

例如:

typedef struct S
{
	int i;
	int arr[];
}type_s;

sizeof("%d\n", sizeof(type_s));//输出的是4

5.2 柔性数组的使用

typedef struct S
{
	int i;
	int arr[];
}type_s;

int main()
{
	int i = 0;
	type_s* p = (type_s*)malloc(sizeof(type_s) + 100 * sizeof(int));
	if (p == NULL)
	{
		perror("malloc->type_s");
		return 1;
	}
	//业务处理
	p->i = 100;
	for (i = 0; i < 100; i++)
	{
		p->arr[i] = i + 1;
	}
	free(p);
	p = NULL;
	return 0;
}

这样的柔性数组成员a,相当于获得了100个整形元素的连续空间。


5.3 柔性数组的优势

上述的type_s结构也可以设计为:

typedef struct S
{
	int i;
	int* p_a;
}type_s;


int main()
{
	type_s* p = (type_s*)malloc(sizeof(type_s));
	if (p == NULL)
	{
		perror("malloc->type_s");
		return 1;
	}
	p->i = 100;
	int* ptr = realloc(p->p_a, 4 * sizeof(int));
	if (ptr == NULL)
	{
		perror("malloc->p_s");
		return 1;
	}
	else
	{
		p->p_a = ptr;
	}
	//业务处理
	for (int i = 0; i < 100; i++)
	{
		p->p_a[i] = i + 1;
	}

	//释放
	free(p->p_a);
	p->p_a = NULL;
	free(p);
	p = NULL;
	return 0;
}

上述两种代码可以完成完全相同的功能,但是第一种实现有两个好处:

第一个好处:方便内存释放

如果我们的代码是在一个给别人的函数中,你在里面做了二次内存分配,并把整个结构体返回给用户。用户调用free可以释放结构体,但是用户并不知道这个结构体的成员也需要free,所以你不能指望用户来发现这个事。所以,我们把结构体的内存以及其成员要的内存一次性分配好了,并返回给用户一个结构体指针,用户做一次free就可以把所有的内存都释放掉。

第二个好处:有利于访问速度

连续的内存有益于提高访问速度,有利于减少内存碎片。(但其实这个因素产生的结果也高不了多少,反正你跑不了用偏移量的加法来寻址)。

拓展阅读:
C语言结构体的数组和指针


6. 结尾

本篇博客到此就结束了,如果对你有帮助记得三连哦。感谢您的支持!!
在这里插入图片描述
在这里插入图片描述

西红柿成熟度检测数据集总结 成熟度类别标注数量semiripe(半成熟)10275rotten(腐烂)13470fullyripe(完全成熟)35031unripe(未成熟)26212。 阅读详情

相关推荐

不只是安装:用OrbbecSDK_ROS2玩转深度相机点云、滤波与DDS调优

本文深入探讨了如何通过OrbbecSDK_ROS2实现深度相机的高级应用,包括点云处理、深度图优化和DDS调优。详细介绍了点云采集与可视化技巧、多种滤波算法的配置与组合策略,以及针对高带宽数据传输的DDS高级调优方法,帮助开发者在机器人导航和三维重建等场景中提升性能。

weixin_29246195的博客 780

C语言学习分享(动态内存管理)

我们首先来思考一下,我们要存放数据时如何向内存开辟空间。根据我们过去的知识,我们有以下两种方式:1.创建变量,创建一个某类型的变量(也可以是结构体变量)。2.创建数组,创建一个大小确定的数组显而易见,这两种方式开辟的内存空间都是固定的,大小在创建时就已经固定了,如果我们在使用时想要控制大小,比如说:我们需要100个数据,但是只有50的空间。或者我们开辟了100的空间,却只有10个数据。对内存的使用效率太低。

passion_ran的博客 159

手把手教你用VSCode+MCUXpresso搭建i.MX RT1062开发环境(附RT-Thread Nano移植)

本文详细介绍了如何使用VSCode和MCUXpresso工具链搭建i.MX RT1062开发环境,包括工具链安装、工程配置、调试技巧以及RT-Thread Nano实时操作系统的移植方法。通过实战步骤和优化建议,帮助开发者快速掌握这款高性能Cortex-M7 MCU的开发流程,提升嵌入式开发效率。

weixin_27014595的博客 392

essential C++第二章学习心得

今天开始正式记录一点学习c++的心得,笔者用的参考书籍是电子工业出版社2012年发行的EssentialC++中文版,由侯捷先生翻译,原版作者也是另外一本c++编程圣经《c++ prime》的作者——Stanley B.Lippman。此书可视为c++prime的简化版,与一般的编程语言参考书籍不同,书中并不是采用以基础知识为框架的层层深入的结构,而是根据不同的编程风格分别介绍c++中包含但是有别

Repaint_The_World的专栏 752

数据库decimal类型详解:精度、标度与金额计算避坑指南

在关系型数据库中,浮点数精度丢失是常见问题,尤其涉及金额计算时,一分钱误差都可能导致对账失败。decimal类型通过十进制存储方式,将小数当作定点数处理,避免了二进制转换误差,确保运算结果精确。其核心在于精度和标度的合理定义,以及运算舍入规则的控制。在电商订单、汇率转换、税务计算等场景中,decimal是保障数据准确性的关键技术。理解其存储原理和实操细节,能有效规避隐式转换、聚合函数精度等常见坑点,提升系统可靠性。

weixin_32050773的博客 272

Web前端开发技术:实验14-16

实验14 1. 编写JavaScript程序实现“九九乘法口诀”表,如图14-40所示。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>九九乘法表</title> </head> <body> <h1>九九乘法表</h1> </body> <scri

KslgmrDry的博客 1万+

学习历程-25岁零基础学习编程(2)

8月10日 自己展示一下学习成果! 《写给大家看的C++》这本书看了85%了,至此,C++的初级的知识内容我已经掌握。指针、类的继承、构造函数等等,比较难的如重载操作符我就跳过去了。动态内存管理和指向对象的指针这块比较难,我理解了一部分。如:pointer->method表示,引用指针变量pointer所保持地址的对象的方法,可以写为(*pointer).method。

shangxindaxiyang的专栏 1175

【问题解决】Python 异步 asyncio 卡死、协程不执行、任务泄漏,保姆级排错

本文详细分析了Python异步编程中常见的卡死、协程不执行和任务泄漏问题。文章首先列举了这些问题的典型表现,如程序卡住、死锁、任务未启动等。然后深入剖析了各类问题的根源,包括同步阻塞操作、未正确await、资源未清理等。针对这些问题,文章提供了两套解决方案:一是异步编程最佳实践,包括安全协程执行、带超时的执行、任务清理等实用方法;二是死锁检测和预防机制,通过锁管理和等待图分析来避免死锁。文章还包含可直接使用的代码示例,帮助开发者快速定位和解决异步编程中的常见问题。

博客 450

CSAPP:动态内存分配器

计算机系统 CSAPP

Lane的小屋 954

Qt实现思维导图功能5『纵向分布模式』

思维导图纵向分布模式:模式一

浮生流年的博客 1057

黑猫带你学eMMC协议第1篇:全网最全emmc协议中文详讲,这份学习框架图,你值得拥有!!!(持续更新中...)

黑猫带你学eMMC协议第7篇:全网最全emmc写保护详解(write protect) 黑猫带你学eMMC协议第8篇:emmc可靠写详解(Write Reliability) 黑猫带你学eMMC协议第9篇:emmc的分区配置(partitioning) 黑猫带你学eMMC协议第10篇:eMMC命令队列详解(CMDQ) 黑猫带你学eMMC协议第11篇:eMMC擦除详解(erase/trim/discard/sanitize/secure erase/secure trim…) 黑猫带你学eMMC协议第12篇:

黑猫奥利奥的博客 2万+

C语言既然可以自动为变量分配内存,为什么还要用动态分配内存呢?_类型已经定了为什么还要动态分配内存

这些仓库和你的超市是分离的,如果你发现你进了一些商品,这些商品短时间内也不会被完全卖出去,那你就可以把这些货物放到你的仓库里,而你只需要记住你仓库的地址即可。我这里先说一下我的理解,我对这个问题的答案总结出以下几点,当然这绝不是全部的原因,鄙人也是能力有限,只能理解到这种程度,更多的理解欢迎大家在评论区进行讨论!本质上讲的是以前所有的内存分配的缺陷。由于堆区内存也是有限的,不能无限制地分配下去,所以秉持着尽量节省资源,我们应该在分配的内存区域不用时,及时释放它,以便其他的变量或程序使用。

2401_84265802的博客 1816

使用 MATLAB/Simulink + Simscape Electrical,构建一个含光伏并网系统与SVG的联合仿真模型,实现动态无功补偿与电压支撑

摘要:本文详细介绍了基于Simulink的SVG与光伏并网逆变器联合系统建模方法。通过构建包含光伏单元、SVG主电路和控制模块的仿真模型,实现动态无功补偿与电压稳定。重点阐述了ip-iq无功检测算法、双闭环控制和SVPWM调制等关键技术。仿真结果表明,该系统能快速响应无功需求,在10ms内将功率因数提升至0.98以上,有效抑制电压波动。文章为新能源并网系统中的电能质量治理提供了实用解决方案,并提出了进一步优化方向。

xiaoheshang_123的博客 322

【c语言】练手:一个简单的图书管理系统

【c语言】练手:一个简单的图书管理系统 最近在学习结构体和结构体指针等内容,为了巩固所学习的内容,于是写了一个简陋的图书管理系统,在敲代码过程中也遇到一些容易忽略的问题,于是记录下来,大家可以给给建议! 核心功能主要有3个:录入书籍信息,打印书籍信息,删除书籍信息。 思路很简单,定义一个结构体Book来实例化结构体变量从而用于存放每一本书的信息。书的信息包括 书名,作者, 价格, 出版时间和出版日期。 //存放书信息的结构体 struct Book { char title[128]; char

laplacepoisson的博客 4546

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

c++------------动态关于最后一个程序

c++结束了动态和关联容器的学习,其实动态内存我还没有弄会,这个需要多做题,多体会; 下面开始数据结构与算法的学习;务必效率和抓经时间;把该学的课程都不紧不慢的提上日程;加油!!! /*--------------- 关键字查询的类 --------------*/ #ifndef _TEXT_QUERY_ #define _TEXT_QUERY_ #include&lt;iost...

qq_41983709的博客 146

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

第六十三天学习记录:C语言个人总结

由于 count 是原子类型,因此每个线程对其进行的操作都是原子的,也就是说,在任何一个时刻,count 变量的值都是一个线程所对其进行的最后一次读写操作的结果,而不会因为线程之间的竞争而出现“竞态条件”。在上面的代码中,_Alignof(struct MyStruct) 返回的是结构体 MyStruct 对齐所需的字节数,由于这个结构体中包含了 int、char、short 等不同类型的成员,因此编译器会计算出一个最合适的对齐方式,输出的结果通常是 4 或 8,具体取决于不同的编译器和平台。

为了上岸 739

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

2019春第八周作业

这个作业属于哪个课程 C语言程序设计II 这个作业要求在哪里 2019年春季学期第八周作业 我在这个课程的目标是 我希望能够通过学习C语言的知识,编写程序 这个作业在哪个具体方面帮助我实现目标 这个作业让我掌握了常用字符串函数以及使用指针操作字符串的方法,掌握动态内存分配 参考文献 函数实现字符串逆序,C 标准库 - <string.h> ,C 内存管理 ,C 库...

weixin_30477797的博客 201

深入探究智能指针与内存管理实践

<p>  <p>  一、引言</p>

m0_75259337的博客 163

完成第一个程序

    今天终于把第一个小程序完成了,虽然看着很乱,但是使用还是很方便的,主要是对文件的操作,其中学习了如何读取文件,如何把文件放在动态内存中,如何对这部分动态内存按要求获取字符,还有就是和部分内存进行比较,以及如何使用结构。用途不是很多,但是用了好几天,现在还是新手,这样还可以原谅,要是今后学习多了,还这样,那就要推出这一爱好了。    另外对文件的声明也可以这样的:char szFil

sea_spray的专栏 526

畏惧c 接触c 理解c

指针的大小和它所指向的数据类型的大小有关,指针本身的大小是固定的(在32位中为4字节,在64位中为8字节),但它所志向的数据类型大小可以不同,你比方说“char”和“int”,它们的数据类型大小分别为1字节和4字节。分享就到这,无论如何,c作为我编程学习的第一门语言,它的基础性质让我更好理解了编程语言,也能为接下来的java学习打下基础,希望百尺竿头,更进一步!对应的释放内存的函数,在C中是`free`函数,如`free(p)`,这里的`p`是使用`malloc`或`calloc`分配内存后的指针。

yorushikaaa的博客 415

C语言既然可以自动为变量分配内存,为什么还要用动态分配内存呢?_类型已经定了为什么还要动态分配内存(2)

你是一个开超市的,栈区就相当于你的超市,但是你会发现如果你如果把商品都放到超市,可能你的超市会装不下那么多货物。这些仓库和你的超市是分离的,如果你发现你进了一些商品,这些商品短时间内也不会被完全卖出去,那你就可以把这些货物放到你的仓库里,而你只需要记住你仓库的地址即可。3、需要数组长度根据程序进行变化。知道了动态分配内存的好处后我们就可以更好的理解我们为什么要使用动态分配内存以及何时应该使用动态分配了,所以如果你进了几包方便面(建了个很小的对象)那你就没必要把方便面放到仓库了,直接放到超市货架上就可以了。

2401_84253380的博客 1024

2024年最新C语言进阶:动态内存管理_内存释放不置空,2024年最新渣本C C++开发小伙如何一步步成为架构师

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以添加戳这里获取一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长! } void test() { int i = 0; int* p = (int*)malloc(10 * sizeof(int)); if (NULL ==

2401_84975223的博客 330

RTThread(一) - 概念及简介

来对代码进行条件编译,最终达到系统配置和裁剪的目的。另外,

2401_85015200的博客 1096

学生信息管理系统修改

北京工业大学耿丹学院 c语言设计课程报告课程设计名称:高级语言程序设计专业班级:计算机科学与技术1姓名:吴双学号:1508092012016年5月10日一对c语言指针链表的体会………………………………………………………………二修改学生信息管理系统………………………………………………………………三 体会………………………………...

weixin_34253539的博客 654

AI如何帮你彻底理解C++指针?3分钟生成可视化学习代码

AI提示词技巧:要明确说明需要"控制台图形界面"和"逐步动画演示"注释的重要性:生成代码包含的详细注释本身就是优质学习材料迭代优化建议:可让AI增加数组指针、函数指针等进阶示例整个项目在InsCode(快马)平台上可以直接运行调试,无需配置本地环境。特别推荐其一键部署功能,能把教学demo变成可分享的在线实验课——比如让学生通过浏览器直接操作指针动画,比截图讲解生动十倍。对于C++教学者或自学者,这种AI+可视化的学习方式值得尝试。

AgatePanther34的博客 419

C语言学习总结(一):入门阶段的理解与困惑

写博客的目的是为了让自己记得更牢,也希望以后回头看这些笔记,能看到自己一步步进步的轨迹。C 语言学习还有很多坑,但每一个卡住的地方,都是以后你能教别人的资本。继续加油!

2301_79835589的博客 730
上一篇: 内存泄漏是什么?有什么危害
下一篇: 如何评判算法好坏?复杂度深度解析
小白debug~
小白debug~ 新星创作者: C/C++技术领域 新星创作者: C/C++技术领域
博客等级 码龄4年 3510粉丝 128原创
评论 27
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白debug~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值