完全自学C(干货) —— 动态内存管理

C++零基础自学教程:300集完整版学习路线与避坑指南 编程语言是计算机科学的基础工具,其核心原理在于通过特定语法规则指挥计算机执行任务。C++作为一门高效、灵活的系统级编程语言,其技术价值在于直接操作内存、支持面向对象与泛型编程,广泛应用于游戏开发、嵌入式系统、高性能计算等领域。对于初学者而言,系统化学习路径至关重要,一套完整的C++教程应覆盖从环境搭建、基础语法到面向对象和标准库的全链路知识。本文基于一套300集完整版C++自学教程,结合零基础学习者的常见痛点,拆解了包括Visual Studio和VS Code环境配置、指针与内存管理等核心概念的学习方法, 阅读详情

目录

一,动态内存函数

malloc

free

calloc

realloc

二,常见的动态内存错误

经典试题

三,C/C++程序的内存开辟

栈区stack

堆区heap

数据段(静态区)static

代码段

四,柔性数组 — flexible array

五,案例


  • 通常开辟的内存是固定的(数组的内存是编译时分配的,但申明时需指定长度);
  • 针对已事先指定内存大小比较合适,对事先不确定的内存大小可使用动态内存函数;

一,动态内存函数

  • 动态内存函数在堆区开辟空间;

malloc

 void* malloc( size_t size )

  • 在内存申请一块连续的空间(字节数),并返回指向这块空间的指针;
    • 如开辟成功,则返回一个指向开辟好空间的指针;
    • 如开辟失败,则返回一个NULL,因此返回值一定要做检查;
    • 返回值类型为void*,使用时需自行决定;
    • 如参数为0,malloc行为未定义,取决于编译器;
//在堆区,开辟4个整型16个字节的空间
int* p = (int*)malloc(4 * sizeof(int));

free

void free( void *memblock )

  • 专门用来做动态内存的释放和回收的;
    • 如参数指针指向的空间不是动态内存开辟的,那free行为是未定义的;
    • 如参数指针为NULL,则函数不做任何操作;
    • 释放后的指针将变为野指针,最好在设置为NULL,避免非法访问;

注:动态内存释放有两种方式

  • free主动释放;
  • 程序结束释放;
int main()
{
	//在堆区,开辟4个整型16个字节的空间
	int* p = (int*)malloc(4 * sizeof(int));
	//检查p是否为空指针
	if (p == NULL) 
	{
		perror("main"); //p为空指针返回错误信息
		return 0;
	}
	//释放动态内存空间
	free(p);
	p = NULL; //避免错误使用
	return 1;
}

calloc

void *calloc( size_t num, size_t size )

  • 开辟指定元素个数的内存,元素初始值为0;
    • num为元素个数,size为每个元素的大小;
    • 与malloc的区别,只在于每个字节初始化值为0;
int main()
{
	//在堆区,开辟4个整型16个字节的空间
	int* p = (int*)calloc(4, sizeof(int));
	if (p == NULL) 
	{
		perror("main"); 
		return 0;
	}
    printf("%d", *p); //0
	free(p);
	p = NULL; 
	return 1;	
}

realloc

void *realloc( void *memblock, size_t size )

  • 调整动态内存空间的大小,让内存管理更加灵活;
    • 如指向的空间之后有足够的内存空间,则直接追加;
    • 如指向的空间之后没有足够的内存空间,则重新开辟新的内存空间,并将原来内存数据拷贝过来且释放其空间,最后返回新的空间地址;
    • 用一个新的变量来接收realloc函数的返回值,realloc可能开辟失败返回NULL;
    • 如对空指针进行操作,等同于malloc; 
int main()
{
	//在堆区,开辟4个整型16个字节的空间
	int* p = (int*)malloc(4 * sizeof(int));
	if (p == NULL) 
	{
		perror("main"); 
		return 0;
	}
	//将p的空间拓展为10整型40个字节的空间
	int* ptr = realloc(p, 10 * sizeof(int));
    if (ptr != NULL) 
	{
		p = ptr;
	}

	free(p);
	p = NULL; 
	return 1;
}
//二者等同
int* p = (int*)malloc(4 * sizeof(int));
int* p = (int*)realloc(NULL, 4 * sizeof(int));

二,常见的动态内存错误

  • 对空指针进行解引用(动态内存可能开辟失败为NULL,使用前需进行判断);
  • 对动态开辟空间的越界访问;
  • 对非动态开辟的内存使用free释放;
  • 使用free只释放了部分动态开辟的内存;
  • 对同一块动态内存多次释放;
  • 动态开辟内存忘记释放;
    • 忘记释放不在使用的动态开辟的空间,会造成内存泄露(切记一定要释放且要正确释放);
//动态内存的指针可能为NULL,在进行解引用操作前,需进行判断;
int main()
{
	int* p = (int*)malloc(10000000 * sizeof(int));
	//使用前,需判断p是否为空
	*p = 10;
	return 0;
}
//对动态开辟空间的越界访问;
int main()
{
	int* p = (int*)calloc(4, sizeof(int));
	if (p == NULL)
	{
		perror("main");
		return 0;
	}
	*(p+4) = 10;
	free(p);
	p = NULL;
	return 1;
}
//对非动态开辟的内存使用free释放;
int main()
{
	int i = 10;
	int* p = &i;
	free(p);
	p = NULL;
	return 1;
}
//使用free释放一块动态开辟内存的一部分;
int main()
{
	int* p = (int*)calloc(4, sizeof(int));
	if (p == NULL)
	{
		perror("main");
		return 0;
	}
	free(p + 2);
	p = NULL;
	return 1;
}
//对同一块动态内存多次释放;
int main()
{
	int* p = (int*)calloc(4, sizeof(int));
	if (p == NULL)
	{
		perror("main");
		return 0;
	}
	free(p);
	free(p);
	p = NULL;
	return 1;
}
//忘记释放动态开辟内存(内存泄漏)
int main()
{
	int* p = (int*)calloc(4, sizeof(int));
	if (p == NULL)
	{
		perror("main");
		return 0;
	}
	return 1;
}

注:

  • 栈区:局部变量、函数形参等;
  • 堆区:动态内存开辟;
  • 静态区(数据段):全局变量、静态变量static;

经典试题

//试题一
void GetMemory(char* p)
{
    //在堆区开辟内存
    //忘记释放,内存泄露
	p = (char*)malloc(100); 
}
int main()
{
	char* str = NULL;
	GetMemory(str); //传值(形式上虽然是地址),函数调用结束p已销毁,并未更改str
	strcpy(str, "hello world");
	printf(str); 
    return 0;
}
//结果:异常访问冲突

//修改1
char* GetMemory(char* p)
{
	p = (char*)malloc(100); 
	return p;
}

int main( )
{
	char* str = NULL;
	str = GetMemory(str); 
	strcpy(str, "hello world");
	printf(str); 
    free(str);
    str = NULL;
    return 0;
}
//结果:hello world

//修改2
void GetMemory(char** p)
{
	*p = (char*)malloc(100);
}

int main()
{
	char* str = NULL;
	GetMemory(&str);
	strcpy(str, "hello world");
	printf(str);
	free(str);
	str = NULL;
    return 0;
}
//结果:hello world
//试题二
char* GetMemory(void)
{
	char p[] = "hello world";
	return p;
}
int main()
{
	//函数调用结束p已销毁
    //尽管p的值已赋给str,但所指的内存已还回系统
	char* str = NULL;
	str = GetMemory();
	printf(str);
    return 0;
}
//结果:烫烫烫烫烫烫烫烫

//修改
char* GetMemory(void)
{
    //static关键字避免销毁(栈区变为静态区)
	static char p[] = "hello world";
	return p;
}
int main()
{
	char* str = NULL;
	str = GetMemory();
	printf(str);
	return 0;
}
//未释放
void GetMemory(char** p, int num)
{
	*p = (char*)malloc(num);
}
int main()
{
	char* str = NULL;
	GetMemory(&str, 100);
	strcpy(str, "hello");
	printf(str);
}
//未判断
//释放,未置空
//访问已释放的空间
void Test(void)
{
	char* str = (char*)malloc(100);
	strcpy(str, "hello");
	free(str);
	if (str != NULL)
	{
		strcpy(str, "world");
		printf(str);
	}
} 

三,C/C++程序的内存开辟

栈区stack

  • 执行函数时,函数内局部变量可在栈上创建,函数执行结束时自动释放;
  • 栈区内存分配运算内置于处理器的指令集中,效率很高,但分配的内存容量有限;
  • 栈区主要存放运行函数而分配的局部变量、函数参数、返回数据,返回地址等; 

堆区heap

  • 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收;
  • 分配方式类似于链表;

数据段(静态区)static

  • 存放全局变量、静态数据;
  • 程序结束后,由系统释放;

代码段

  • 存放函数体(类似成员函数和全局变量)的二级代码;
  • 常数;

四,柔性数组 — flexible array

  •  在C99,结构中的最后一个元素永许是未知大小的数组,即为柔性数组成员;
  • 结构中的数组,是大小可变的数组;
struct S
{
	char c;
	int arr[]; //或arr[0],此数组即为柔性数组成员
};

特点:

  • 柔性数组成员前面必须至少一个其他成员;
  • sizeof返回的大小不包括柔性数组内存;
  • 包含柔性数组成员的结构,用malloc()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小;
struct S
{
	char c;
	int arr[]; 
};

int main()
{
	printf("%d", sizeof(struct S)); //4
}
//会考虑对齐数
//柔性数组形式
struct S
{
	int n;
	int arr[]; 
};

int main()
{
	//sizeof(struct S)是分配给n的
	//10 * sizeof(int)是分配给arr的
	struct S* p = (struct S*)malloc(sizeof(struct S) + 10 * sizeof(int));
	if (p == NULL)
	{
		perror("main");
		return 0;
	}
	
	free(p);
	p = NULL;
	return 1;
}

//指针形式
struct S
{
	int n;
	int* arr;
};

int main()
{
	struct S* p = (struct S*)malloc(sizeof(struct S));
	if (p == NULL)
	{
		perror("p");
		return 0;
	}

	p->arr = (int*)malloc(10 * sizeof(int));
	if (p->arr == NULL)
	{
		perror("p->arr");
		return 0;
	}

	free(p->arr); //需先释放
	p->arr = NULL;

	free(p);
	p = NULL;
	return 1;
}

优势:

  • 方便内存释放,多个malloc复杂且容易忘记释放;
  • 有利于访问速度,连续的内存空间,无内存碎片;

注:局部性原理

  • 空间局部性,下次会大概率会使用当前内存的周边区域;
  • 时间局部性,被引用过一次的存储器位置在未来会被多次引用(通常在循环中);

C语言结构体里的成员数组和指针

五,案例

C++暑期高效学习指南:从零基础到项目实战的完整路径 编程语言作为计算机与开发者沟通的核心工具,其设计理念与实现原理深刻影响着软件的性能与架构。C++作为一门兼具高性能与底层控制能力的静态类型编译语言,其核心价值在于提供了对硬件资源的精细管理能力,同时通过面向对象、泛型编程等范式支持复杂系统的构建。这使得它在系统软件、游戏引擎、高频交易等对性能与可靠性要求极高的应用场景中占据不可替代的地位。掌握C++不仅能深入理解计算机系统的工作机制,其严谨的语法与内存管理模型也为学习其他高级语言奠定了坚实基础。本文以**环境搭建**和**核心语法**为切入点,系统梳理了从编 阅读详情

相关推荐

2022精心整理的C语言学习宝藏,值得收藏~

C 语言可以零基础入门,它的语法是很多高级编程语言的基础,比如说 Java、C++;并且起到承上启下的作用,向上可以学习高级编程语言,向下可以学习计算机组成原理、操作系统等等偏基础的计算机基础知识。 C语言相关电子书: 推荐书籍: 第一本书《阿哈C语言》的写书风格个人认为比较风趣幽默,对于培养兴趣,基础学习还是很不错的 《C程序设计语言》,机械工业出版社,作者Brian W. Kernighan / (美)Dennis M. Ritchie。C 语言之父写的,入门经典书籍。 《

编程与实战的博客 2472

[APM32F407]APM32F4 基于Azure RTOS动态内存管理的应用过程分享

涉及了动态内存必备的申请、释放,以及相关内存的信息获取,这部分的信息我们均可从Azure RTOS的手册中看到:[第 4 章 - Azure RTOS ThreadX 服务的说明 | Microsoft Learn](https://learn.microsoft.com/zh-cn/azure/rtos/threadx/chapter4)根据上面的描述,与之对应的“动态内存”相关的特性我们就可以触类旁通,程序运行过程中的buffer的大小及位置能进行更改的,这便是“动态”。

ic2121的博客 430

别再为H桥烧MOS管发愁了!手把手教你用IR2104搭建稳定电机驱动(附自举电路详解)

本文详细解析了使用IR2104半桥驱动芯片构建高可靠H桥电机驱动电路的全过程。从芯片内部架构、自举电路原理到PCB布局技巧和实战调试方法,帮助工程师彻底解决MOS管烧毁问题。重点讲解了自举电容选型、死区时间控制等关键设计要点,并附有示波器实测波形分析,是电机驱动设计的实用指南。

我的博客 739

动态内存管理

动态内存管理 一、什么是动态内存管理? 二、常见的动态内存分配函数 1.malloc函数 2.free函数 3.calloc函数 4.calloc函数 三、常见错误 1.对NULL指针的解引用操作 2.对动态内存开辟的空间越界访 3.对非动态开辟的内存空间使用free释放 4.使用free释放一块动态开辟内存的一部分 5.对同一块动态开辟内存重复释放 6.动态开辟内存忘记释放(内存泄漏)

qq_45469266的博客 1209

【UE 反射】反射的原理是什么?如何使用机制?

静态类型检查确保了类型的早期一致性和高效的代码执行,但减少了灵活性。动态类型检查提供了更大的灵活性,但增加了运行时的开销和潜在的错误。反射作为一种动态特性,无论是在静态类型语言还是动态类型语言中,都提供了强大的运行时类型操作能力,但也伴随着性能和安全性方面的权衡。通过理解这些联系,开发者可以在不同的编程语言和应用场景中选择适合的类型检查方式和反射机制,以实现所需的动态行为和灵活性,同时保证性能和安全性。

hhw_hhw的博客 6031

Acer宏碁暗影骑士擎AN515-58原厂系统恢复指南:从ISO镜像到完整出厂设置

本文详细介绍了为Acer宏碁暗影骑士擎AN515-58游戏本恢复原厂系统的完整指南。从准备工作、数据备份到下载官方镜像、制作恢复U盘,再到BIOS设置与恢复流程,一步步教你如何将系统完整还原至出厂状态,确保所有硬件驱动、NITROSENSE控制中心等专属优化功能恢复正常,解决系统卡顿、功能异常等问题。

weixin_29271263的博客 1093

RT-Thread Nano移植使用整理

https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-nano/an0038-nano-introduction 一、RT-Thread Nano 简介 RT-Thread Nano 是一个极简版的硬实时内核,它是由 C 语言开发,采用面向对象的编程思维,具有良好的代码风格,是一款可裁剪的、抢占式实时多任务的 RTOS。其内存资源占用极小,功能包括任务处理、软件定时器、信号量、邮箱和实时调度等相对完整的实时操作系统特性。适

OnlyLove_的博客 7837

YOLO11涨点优化:卷积魔改 | 可变形条带卷积(DSCN),魔改轻量DCNv3二次创新

如何跟YOLO11结合:1)和C3k2创新性结合

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 986

运用动态内存管理编写通讯录(后附源码)

通讯录改进

m0_64334842的博客 512

YOLO系列算法改进 | Head改进篇 | 融合Detect_LSCD轻量共享卷积检测头 | 轻量化设计破解计算瓶颈,增强复杂场景目标感知能力

YOLO系列算法改进 | Head改进篇 | 融合Detect_LSCD轻量共享卷积检测头 | 轻量化设计破解计算瓶颈,增强复杂场景目标感知能力 (以YOLO26最新目标检测模型为基础,融合Detect_LSCD检测头进行改进)

2502_91881744的博客 702

RK3588平台开发系列讲解(以太网篇)MDIO底层驱动

沉淀、分享、成长,让自己和他人都能有所收获!😄。

内核笔记 6884

动态内存管理(malloc calloc realloc free)--- C语言

本文介绍了C语言中四个常用的内存分配和释放函数,它们是:malloc、calloc、realloc 、free。文章中讨论了这些函数的使用方法,示例代码,常见的动态内存错误以及如何防止内存泄漏。

m0_50655389的博客 830

芒果YOLOv12改进90:检测头篇之ShareSepHead:即插即用|原创新颖共享Sep检测头,更省参数量,更高效,打造新型YOLOv8检测器,精度高效涨点

芒果YOLOv12改进90:检测头篇之ShareSepHead:即插即用|原创新颖共享Sep检测头,更省参数量,更高效,打造新型YOLOv8检测器,精度高效涨点

包括YOLOv5、YOLOv7、YOLOv8等模型改进 343

0基础C语言自学保姆教程——第十二节 动态内存分配

0、动态内存分配的意义与存在背景 1、动态内存开辟函数介绍 1-1 malloc和free 1-2 calloc 1-3 realloc 2、常见的动态内存开辟错误分析 2-1 对NULL指针的解引用操作 2-2 对动态开辟空间的越界访问 2-3free函数使用不当 2-3-1 free函数释放不是动态开辟的内存 2-3-2 free不完全 2-3-3 忘记free 3、补充:C/C++程序的内存开辟(重要) 4、柔性数组

jxwd的博客 465

ConvNeXt 改进 :ConvNeXt添加GnConv递归门控卷积,二次创新CNBlock结构 ,独家首发

视觉 Transformer 在多种任务中取得了显著的成功,这得益于基于点积自注意力的新空间建模机制。视觉 Transformer 中的关键因素——即输入自适应、长距离和高阶空间交互——也可以通过卷积框架高效实现。作者提出了递归门控卷积(Recursive Gated Convolution,简称 gnConv),通过门控卷积和递归设计执行高阶空间交互。该新操作具有高度的灵活性和可定制性,兼容各种卷积变体,并将自注意力中的二阶交互扩展到任意阶数,而不会引入显著的额外计算。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 234

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

完全自学C(干货) —— 指针初识

指针即内存地址(编号);

NapoleonCoder的博客 356

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

戏说c语言文章汇总,2024年最新满满的干货

本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论。

2401_83946044的博客 472

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

学嵌入式和C语言编程|学习日记Day17:吃透内存管理与位运算

自学嵌入式 C 来到第 17天,终于接触到贴近硬件底层的核心内容:堆区动态内存管理、基础位运算。这两块是写单片机、嵌入式工程绕不开的知识点,内存管理决定程序稳不稳定,位运算决定代码效率高不高,今天就把笔记里的干货完整整理出来。位运算直接操作二进制比特位,运算速度是算术运算里最快的,寄存器配置、IO 口控制全靠它。,这块内存会一直被占用,系统无法回收,就形成内存泄露。有符号数高位补符号位,无符号数高位补 0,等价。全 1 为 1,有 0 则 0。高位直接舍弃,低位补 0,等价。0 变 1,1 变 0。

kkkkkkkkkk_Z的博客 309

C语言零基础入门:21天从新手到独立编程

C语言作为一门经典且强大的编程语言,在系统软件、嵌入式开发、游戏开发等众多领域都有着广泛的应用。对于零基础的技术人员来说,掌握C语言不仅能为后续的学习和工作打下坚实的基础,还能培养良好的编程思维。本文将为你提供一个21天的C语言学习路线图,帮助你从新手逐步成长为能够独立编程的开发者。

星辰夜语的博客 1061

C语言零基础教程:100集从入门到就业,学习路径与实战指南

C语言作为计算机编程的基石,是理解计算机底层原理和内存管理的核心语言。其编译执行机制、指针操作和内存直接操控能力,构成了系统软件、嵌入式开发和高性能计算的技术基础。掌握C语言不仅能夯实编程思维,更能为学习数据结构、操作系统及后续高级语言打下坚实基础。本教程以就业为导向,通过系统化的知识体系,覆盖从环境搭建、基础语法到指针、内存管理、文件操作及项目实战的全链路内容。针对零基础学习者,教程强调动手实践与调试能力,提供清晰的学习阶段划分和常见问题解决方案,帮助初学者在一个月内建立可验证的编程技能,并最终完成学生管

weixin_30314793的博客 358

零基础C++自学路线:从环境配置到项目实战的完整指南

C++作为一门经典的编程语言,其核心在于对内存管理和系统资源的直接控制能力。理解其工作原理,需要从变量、函数、指针等基础概念入手,逐步深入到面向对象编程和标准模板库(STL)的应用。掌握C++不仅能提升对计算机底层运行机制的理解,更能为高性能计算、游戏开发、系统软件等领域打下坚实基础。对于初学者而言,一套清晰的学习路径至关重要,它应涵盖从环境配置、语法基础到项目实践的完整闭环。本文基于C++自学教程和零基础入门等高频搜索需求,探讨如何规划一条高效的学习路线,帮助学习者避免常见误区,并通过分阶段的项目练习,将

weixin_29311017的博客 313

c语言程序设计课程总结600字,2019年春季学期《C语言程序设计II》课程总结

2019年春季学期《C语言程序设计II》课程总结1.课程情况2.课程总结学生的课程总结:本学期的目标让课程形成模式,在较为清晰的教学内容的基础上,形成可持续性的教学管理方式,让同学们通过我的课堂,提高自主学习的能力。措施课程讲授尽量贴近课本,帮助同学们理解基础,而作业尽量扩展,学生完成作业不得不查阅课本外的信息,消化并运用。学习情况反馈:期末问卷调查:作业情况:千帆竞发图软件1班:软件2班:计算机...

weixin_30953869的博客 593

嵌入式开发入门:从C语言到单片机实战的保姆级学习路径

嵌入式系统作为以应用为中心、软硬件可裁剪的专用计算机系统,其核心在于对硬件资源的直接、高效控制。这一特性决定了C语言成为其开发的首选,因为C语言兼具高效性、可移植性及贴近硬件的操作能力,尤其是指针和位操作等核心概念,是直接读写硬件寄存器、实现底层驱动的关键。掌握这些技术,对于开发智能穿戴、工业控制、物联网终端等对成本、功耗和可靠性有严格要求的设备具有重要价值。本文聚焦于嵌入式开发中最经典的入门实践——单片机开发,通过剖析C语言在嵌入式视角下的重点(如指针操作硬件、位控制及静态内存管理),并结合具体的单片机(

weixin_30621711的博客 608

指针和动态分配内存 (不定长度数组)------新标准c++程序设计

背景:   数组的长度是定义好的,在整个程序中固定不变。c++不允许定义元素个数不确定的数组。例如: int n; int a[n]; //这种定义是不允许的   但是在实际编程中,往往会出现要处理的数据数量在编程时无法确定的情况。如果总是定义一个尽可能大的数组,又会造成空间浪费。何况,这个“尽可能大”到底应该多大才够呢?   为了解决这个问题,c++提供了一种“...

dew0927的博客 983

C++进阶 —— multimap

关联式容器multimap;

NapoleonCoder的博客 9441

C++初阶 —— 入门/概念

C++相关概念!

NapoleonCoder的博客 9043
上一篇: 完全自学C(干货) —— 自定义类型
下一篇: 完全自学C(干货) —— 文件
挨代码
博客等级 码龄5年 1696粉丝 384原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值