C/C++ 内存分配知识

C/C++基础知识10道题,你都会吗? 题目1:指针基础知识 题述:描述指针数组和数组指针(指向数组的指针)的区别并举例 考察点:C指针的基础知识 答案:考虑如下 char *q[] = {“xxx”, “xxx”, “xxx”}; 指针数组,q[0] 为一个指针 char (*p)[] = a; 数组指针,p[0] 为一个变量 时间:1min 题目2:内存分配 题述:描述c程序内存分配方式以及它们的区别(5分钟) ... 阅读详情

C语言中内存 分为五个区
栈(stack) :用来存放函数的形参和函数内的局部变量。由编译器分配空间,在函数执行完后由编译器自动释放。
堆(heap) :用来存放由动态分配函数(如malloc)分配的空间。是由程序员自己手动分配的,并且必须由程序员使用free释放。如果忘记用free释放,会导致所分配的空间一直占着不放,导致内存泄露。
全局区/静态区 :用来存放全局变量和静态变量。程序结束时由系统释放,分为全局初始化区和全局未初始化区; 存在于程序的整个运行期间,是由编译器分配和释放的。
文字常量区 :常量字符串放于此,程序结束时由系统释放。 例如char *c = “123456”;则”123456”为文字常量,存放于文字常量区。也由编译器控制分配和释放。
程序代码区 :用来存放程序的二进制代码。 

下面通过几个例子来看一下,具体C程序中的内存分配吧:

/* 例1    main1.c */
int a = 0; //全局初始化区
char *p1; 
//全局未初始化区
void main()
{
int b; //栈
char s[] = “abc”; //s在栈,"abc/0"在文字常量区
char *p2; //栈
char *p3 = “123456”; //"123456/0"在常量区,p3在栈上
static int c =0; //全局区
p1 = (char *)malloc(10); //p1在栈,分配的10字节在堆
p2 = (char *)malloc(20); //p2在栈,分配的20字节在堆
strcpy(p1, “123456”); //"123456"放在常量区,
编译器可能 会优化为和p3的指向同一块区域
}

 

/* 例2    main2.c */
//返回char型指针
char *f()
{
//s数组存放于栈上
char s[4] = {'1','2','3','0'};
return s; //返回s数组的地址,但程序运行完s数组就被释放了
}
void main()
{
char *s;
s = f();
printf (%s, s); //打印出来乱码。因为s所指向地址已经没有数据
}

 

C++ 五大内存分区

在C++ 中,内存分成5 个区,他们分别是堆、栈、自由存储区、全局/ 静态存储区和常量存储区。

栈 ,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。

堆 ,就是那些由new 分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new 就要对应一个delete 。如果程 序员没有释放掉,那么在程序结束后,操作系统 会自动回收。

自由存储区 ,就是那些由malloc 等分配的内存块,他和堆是十分相似的,不过它是用free 来结束自己的生命的。

全局/静态存储区 ,全局变量和静态变量被分配到同一块内存中,在以前的C 语言中,全局变量又分为初始化的和未初始化的,在C++ 里 面没有这个区分了,他们共同占用同一块内存区。

常量存储区 ,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法 很多)


《Unix环境高级编程》(著名的APUE)中提出:
C 程序的内存布局:Text , Data , BSS , Stack, Heap.
Text
是程序的代码段 。
Data
是程序中初始化了的全局、静态数据变量。
BSS
是程序中未初始化的全局、静态数据变量。即使全局、静态数据变量初始化为 0 仍然是属于 BSS 段。(未初始化的数据段 )
Stack
是程序中的局部变量,由高地址到低地址向下增长。

Heap
是 malloc 调用动态分配的内存,由低地址到高地址向上增长。

根据网上别人的观点结合自己的测试 ,得出的结论:
1、 经过初始化的全局变量和静态变量保存在数据段中。
2、 未经初始化的全局变量和静态变量保存在BSS段。
3、 函数内部声明的局部变量保存在堆栈段(栈)中,函数调用相关信息也在栈中。
4、 const修饰的全局变量保存在文本段中,const修饰的局部变量保存在堆栈段中。
5、 字符串常量保存在文本段中。 

查看各段的大小用size命令:size test .out  (test.out为编译连接后的可执行文件),可以查看到text、data、bss段的大小。

【C/C++】笔试面试题及答案汇总 第一部分:基本概念及其它问答题1、关键字 static 的作用是什么?2、“引用”与指针的区别是什么?3、.h 头文件中的 ifndef/define/endif 的作用?4、#include 与 #include “file.h”的区别? 5、描述实时系统的基本特性6、全局变量和局部变量在内存中是否有区别?如果有,是什么区别?41、一个单向链表,不知道头节点,一个指针指向其中的一个节点,问如何删除这个指针指 向的节点?39、写一个“标准”宏36、动态内存分配(Dynamic memory al 阅读详情

相关推荐

使用 EasyExcel 实现 百万级数据导入导出

在项目开发中往往需要使用到数据的导入和导出,导入就是从Excel中导入到DB中,而导出就是从DB中查询数据然后使用POI写到Excel上。大数据的导入和导出,相信大家在日常的开发、面试中都会遇到。很多问题只要这一次解决了,总给复盘记录,后期遇到同样的问题就好解决了。好啦,废话不多说开始正文!1.如此大批量数据的导出和导入操作,会占用大量的内存实际开发中还应限制操作人数。2.在做大批量的数据导入时,可以使用jdbc手动开启事务,批量提交。

houxian1103的博客 2701

C/C++内存分配相关知识详解

一、malloc的底层原理       【Note】:

青萍之末的博客 5164

从BUCK-BOOST到反激:一个‘拆电感’的视角,轻松理解多路输出交叉调整

本文从BUCK-BOOST电路到反激变换器的演变入手,通过‘拆解电感’的独特视角解析多路输出交叉调整机制。深入探讨了反激电路的能量暂存方式、传递路径变化及电压关系,并结合具体参数对比揭示其特性。针对多路输出中的电压平衡问题,提供了绕组排布优化、元器件选型等实战技巧,帮助工程师有效提升电源系统的稳定性与效率。

weixin_33738578的博客 437

C/C++内存分配知识

原文出处:http://smilejay.com/2013/12/memory-allocation-in-c-and-cpp/ C语言中内存分为五个区: 栈(stack):用来存放函数的形参和函数内的局部变量。由编译器分配空间,在函数执行完后由编译器自动释放。 堆(heap):用来存放由动态分配函数(如malloc)分配的空间。是由程序员自己手动分配的,并且必须由程序员使用

up2wing的专栏 887

RAG-Anything 实战:构建企业级多模态知识图谱问答系统

本文详细介绍了如何利用RAG-Anything构建企业级多模态知识图谱问答系统,解决跨模态文档处理的痛点。通过架构设计解析、部署实战指南和典型业务场景解决方案,帮助企业实现高效的知识管理和智能检索,提升决策效率。

weixin_29089057的博客 385

DAC8760高精度数模转换器原理与工业级嵌入式应用

数模转换器(DAC)是工业测控系统中实现数字指令到模拟执行的关键接口,其核心性能由分辨率、线性度、温漂及系统级TUE(总未调整误差)共同决定。DAC8760作为一款16位四象限精密DAC,集成了可编程增益放大器(PGA)、内部基准源与SPI高速接口,支持电压/电流双模输出,显著提升闭环控制精度与硬件适配灵活性。其技术价值在于将高精度模拟前端与数字控制深度耦合,满足PLC、ATE及激光偏置等严苛场景对长期稳定性与多通道同步性的要求。本文围绕DAC8760的寄存器配置、HAL/LL驱动实践、PCB布局规范、现场

weixin_42315569的博客 583

c/c++关于内存分配的知识

一个由c/C++编译的程序占用的内存分为以下几个部分  1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。  2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。  3、全局区(静态区)(static)—,全局变量和静态变量

长风v持成的博客 317

Unity中基于SkinMeshRenderer的骨骼动画换装系统优化实践

本文深入探讨了Unity中基于SkinnedMeshRenderer的骨骼动画换装系统优化实践。针对换装卡顿、显示错误等常见问题,文章剖析了SkinnedMeshRenderer的核心数据原理,对比了“数据替换”与“实体替换”两种主流方案的性能差异,并详细阐述了通过骨骼字典缓存、对象池管理、材质合并与Draw Call优化等实战技巧,构建高性能、高稳定性的生产级换装系统。

weixin_29008055的博客 314

C/C++程序的内存分配知识

― 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。这个空间是公用的,如果没有释放会使得可用堆区空间变小,最好在申请后手动释放。―,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。― 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。4、文字常量区 ―常量字符串就是放在这里的。5、程序代码区―存放函数体的二进制代码。

积极自律 246

企业级 Agent 在 K8s 上的运行模型

Kubernetes├── Agent Orchestrator(控制面)├── Agent Runtime Pods(执行面)├── Graph DSL(流程层)├── Tool Services(能力层)K8s(调度)+ Graph(流程)+ Agent(决策)+ Tool(执行)+ Guard(治理)

一起修行,不孤单。这里有编程语言、开发工具、学习方法论和踩坑笔记。用简单的话说复杂的事,陪你从小白到进阶。周更干货,欢迎一起成长! 1174

基于DWA算法的机器人动态避障技术实现及matlab代码

DWA算法是一种基于轨迹的运动规划算法,其核心思想是:在机器人当前位置及速度的基础上,结合机器人感知到的环境信息,生成一组合法的速度指令,然后从这组速度指令中选取代价最小的速度指令作为机器人的下一步操作。下面,我们将通过一个实例来演示基于DWA算法的机器人动态避障技术实现。假设机器人在一个宽敞的场地内行驶,但场地内有一些固定障碍物和移动障碍物,机器人需要避开这些障碍物,并在场地内自由移动。本文给出了一种基于DWA算法的机器人动态避障技术实现及相应的matlab代码,读者可以根据自身需求进行修改和调整。

uote_e的博客 1003

重学C#之前传——由C/C++开发经验总结的程序内存分配知识

最近一位写单片机嵌入式程序的同事因为工作需要,要学习C#开发应用层程序。然而她学习的角度很独特,不同于一般语言学习者的学习流程:优先学习语法,了解how之后先投入开发,在随着经验的积累去深究why。而是每学习一项语法,都去关心它在内存上的分配,直接考虑最底层,甚至对于C#转为CLR后包装的逻辑都不甚关心。而因为纯粹的C#使用者一般不甚了解此类知识,所以C/C++和C#都有开发经验的我被要求共同探讨

dll900201的专栏 665

GlobalBuildingAtlas 建筑物白模数据下载

GlobalBuildingAtlas基于OSM开源数据构建全球建筑物3D白模,提供在线浏览和下载服务。官方资源包括GitHub项目地址和TUM数据库链接,支持行政区划检索建筑物数据。

一醉千秋的专栏 541

C/C++ 知识回顾 内存分配的类别、堆和栈的区别

C++中的内存一般分为以下几类 1.栈区:又编译器分配和释放,存放局部变量,函数参数等 2.堆区:一般由程序员分配和释放,如果程序员不释放,程序结束时由系统回收。 3.静态区(全局区):全局变量和静态变量放在一起,初始化的全局变量和静态变量放在一块区域,未初始化全局变量和静态变量放在相邻的另一块区域 4.文字常量区:存放常量字符串 5.程序代码区:存放二进制代码

聆听风雨的博客 677

STM32F407中文手册

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

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

破解C/C++内存分配与管理:内存对象模型硬核剖析

C++的内存管理是编程中的一把「双刃剑」——它赋予开发者极致的性能控制权,却也暗藏内存泄漏、悬垂指针、碎片化等致命陷阱。无论是初学者的 new/delete 误用,还是资深工程师的智能指针循环引用问题,内存相关的缺陷往往成为代码质量的重中之重,也是小白学习内存分配管理的不二之选!

月亮永悬不落,剑指巅峰 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C/C+小记

0、基本知识 基本数据类型 char、short( int)、int、long( int)、long long (int)、float、double、long doulbe,括号内内容表示可省略。除了上述几种外,前5中还有对应的unsigned类型。3u、3ul、1.2f、1.2L。 常量:整型常量、浮点型常量、符号常量(用#define定义)、字符常量、字符串常量、枚举常量 字符常量...

weixin_30548917的博客 4631

Camera2Demo

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

阿里巴巴电话面试C/C++基础知识整理【面试经验】

笔者今天接到阿里巴巴的电话面试邀请,感觉基础知识薄弱。还需要加强学习,下面将这方面相关的知识整理,与大家共同学习共勉。 基础的知识: STL容器,算法。 重点的知识:C/C++强调速度和内存管理,指针,内存这是重点。     引用和指针的区别与联系 区别 指针是一个实体他在栈中有自己使用的空间,但是引用没有; 引用必须初始化,指针不用但是最好初始化 指针使用时必须加*,引用不...

周末参见 6861

C/C++程序内存的分配

C/C++程序内存的分配

blog 180

C/C++知识点回顾与总结

  本博客总结C/C++的常见知识点,如有问题欢迎提出,转载请注明出处http://blog.youkuaiyun.com/qq_34342154/article/details/78876099 一、C和C++的区别 C++在C的基础上增加类 C面向过程,C++面向对象 C主要考虑通过一个过程将输入量经过各种运算后得到一个输出, C++ 主要考虑是如何构造一个对象模型,让这个模型契合与之对应的问题域,...

冰殇的博客 864

C_C++

对于非静态数据成员,每个对象有一个副本。而静态数据成员是类的成员,只存在一个副本,被所有对象共享。静态成员变量没有实例化对象也可以使用,“类名:静态成员变量”静态成员变量初始化在类外,但是 private 和 protected 修饰的静态成员不能类外访问。class Stupublic:private://初始化静态成员变量int main()//输出19;//错误的,私有无法访问。Stu s;//输出19;//错误的,私有无法访问。return 0;

weixin_45179371的博客 1534

c++ 窗体上输出文字_C/C++面试经典习题

面试题 6:写一个“标准”宏 MIN #define min(a,b)((a)<=(b)?(a):(b)) 注意:在调用时一定要注意这个宏定义的副作用,如下调用: ((++*p)<=(x)?(++*p):(x)。 p 指针就自加了两次,违背了 MIN 的本意。 3 面试题 7:一个指针可以是 volatile 吗 可以,因为指针和普通变量一样,有时也有变化程序的不可控性。常见例:子中断...

weixin_32652107的博客 241

3 c/c++面试题

用于实现多文件编程中的跨文件访问。

wt20050610的博客 1210
上一篇: JDBC获取数据库各种信息
下一篇: Java在windows上操作系统文件与程序,执行系统命令等的技巧
zxycode007
博客等级 码龄18年 53粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值