c语言学习笔记-内存02


  1. 特性
    1. 自动分配
    2. 脏内存
    3. 反复使用
    4. 临时性

  2. 在有操作系统的平台上面,堆由对内存管理器管理
    特性
    1. 主动申请
    2. 脏内存
    3. 需要释放
    4. 临时性
    5. 大块内存

使用流程
申请-检查是否申请成功-存入数据-释放
使用这段内存空间前,最好先用memset将内存清一下零再使用
在使用堆内存的过程中,一定不要丢掉申请的内存指针,否则这块内存得不到释放,就会发生内存泄漏
堆中的内存是按块分配的,在gcc中,最小可申请的空间是16字节,而且在c语言中,越界使用堆内存是不会报错的,除非申请的空间超过堆栈空间,编译器才会报错

  1. 静态存储区
    静态存储区是由代码段(.text),数据段(.data)和bss段构成的
    编译器在编译可执行文件的过程中,将程序分为可可执行的代码和数据
    代码段内存储的就是可执行的代码,也可以理解为函数的集合
    数据段和bss段存储的都是数据,也就是全局变量和静态局部变量,两者区别在于,数据段存储的是显式初始化为非零值的全局变量和静态局部变量
    bss段存储的是未显式初始化和显式初始化为零的全局变量和静态局部变量
    同时需要注意的是,在全局变量中定义的字符串和某些编译环境下被const关键字修饰的变量,也会被编译器加入到代码段中,所以在程序中是无法更改他们的,但是在gcc中,const关键字只会通过编译器检查是否有被更改,变量还是放在数据段的

  2. 总结
    以上几种内存方式中,栈和代码段,数据段的操作都不是开发者能主动分配的,只有堆内存是可以自由使用的
    堆的使用很大程度上可以替换数据段的使用,只是二者生命周期不同,数据段的生命是贯穿程序运行始终的,而堆则是从开辟到释放

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习C语言,首先要明确地告诉自己:C语言是世界上最值得学习的语言。如今决定学习任何一门其他语言之前,都要先考察这个语言有什么成功项目吗?唯独C语言没有必要问,因为世界上所有最最重要的的系统中,都必然有C语言的身影。比如操作系统内核、高级语言底层等等。为什么C最适合担任系统核心?主要原因可能是C语言具有和汇编语言的对应性,一条C语言代码,对有经验的人来说,可以转换为一条或多条汇编代码,也就是说编译结果具有可预测性。C代码不会在被编译时被加上奇奇怪怪的修饰,也不会在二进制兼容性方面带来大问题。这种稳稳当当的语言,一切都在掌握之中,一切荣耀归属于coder,一切错误也归罪于coder。学习C语言的同时,就自然而然的理解了硬件与操作系统的浅表一层。比如int有几个字节的问题,已经是QQ加群验证是否是程序员的一个标准了(笑),这从侧面说明了学习C语言时确实会关心底层软硬件的实现。C语言简单的基于值类型的数据类型体系(引用靠指针,指针本身也是值类型),保持了和硬件底层的一致性(即内存、缓存、寄存器只能保存值),不会出现其他语言比如C#那样既有值又有引用反而对理解底层实现制造了障碍。从某些角度上讲,C语言从设计上来说并不是为了让我们更好的写逻辑代码而设计的,它真的是“只能是这样”,没有对错好坏之分。因为计算机体系结构就是这样的、汇编就是这样的,所以C语言大致也只能是这样的,谁也不能随意捏造它。它足够简单,评论它的设计优劣意义不大。废了这么多口舌,是为了坚定思想,端正态度,只有抱着“最好”的态度,才能排除杂念,勇往直前。时代在进步,某些东西易逝,而另一些东西持久。很多编程大师都用亲身经历告诉你,C语言永远值得用最纯粹的态度去学习
C语言中,计算一个结构体占用多大的内存可以根据以下规则进行计算。首先,结构体的大小是其成员变量所占内存大小的总和,但是要注意对齐规则。结构体内存对齐的基本原则是,结构体的起始地址要对齐到其最宽的成员变量的大小的倍数。也就是说,结构体的起始地址要能够同时满足所有成员变量的对齐要求。 例如,如果有一个结构体`struct example`,其中包含了不同类型的成员变量,比如`int`、`char`和`double`,那么根据对齐规则,编译器会在不同类型的成员变量之间插入一些空白字节,以满足对齐要求。 具体的对齐规则可能因编译器和操作系统的不同而有所差异,但通常情况下,对齐要求是按照成员变量的大小来确定的。比如,`char`类型一般对齐要求为1字节,`int`类型一般对齐要求为4字节,`double`类型一般对齐要求为8字节。 因此,计算结构体的内存大小时,需要按照对齐规则,将每个成员变量的大小上取整到其对齐要求的倍数,然后将这些大小相加。最后得到的结果就是结构体的大小。 需要注意的是,在某些情况下,可以通过使用`#pragma pack`指令来改变对齐规则。比如,`#pragma pack(4)`可以将对齐要求设置为4字节。但是在嵌入式开发中,为了节约内存使用,可能需要手动设置对齐规则。 总结起来,计算C语言结构体的内存大小,可以按照以下步骤进行: 1. 根据对齐规则,确定每个成员变量的对齐要求。 2. 将每个成员变量的大小上取整到其对齐要求的倍数。 3. 将这些大小相加,得到结构体的大小。 参考资料: C语言学习笔记-结构体占用内存大小的计算 结构体内存对其计算结构体大小 C语言数据类型占内存大小

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值