C语言专题笔记——结构体

本文介绍了C语言中结构体的相关知识,包括内存的分配(栈、堆、数据区)、结构体的对齐访问原理以及offsetof和container_of宏的使用。同时探讨了大小端问题在结构体中的影响,帮助读者深入理解C语言的内存管理和结构体操作。
摘要由CSDN通过智能技术生成
程序中内存从哪里来

在一个c语言程序中,能够获取内存的三种情况:栈(stack)、堆(heap)、数据区(.data)。
栈:
  运行时自动分配&自动回收
  反复使用:栈内存在程序中其实就是一块空间,程序反复使用这块空间。
  脏内存
  临时性
  栈会溢出
堆:
  OS堆管理器管理
  大块内存
  程序手动申请&释放
  脏内存
  临时性:堆内存只在malloc和free之间属于此进程,而可以访问,在malloc之前和free之后都不能再访问,否则会有不可预料的后果。

malloc(4) gcc中的malloc默认最小是以16B为分配的单位的。如果malloc小于16B的大小都会返回一个16字节大小的内存,malloc实现时没有实现任意自己分配,而是允许一些大小的块内存的分配。

数据区:
  编译器在编译程序的时候,将程序中的所有元素分成了一些组成部分,各个部分构成了一个段,所以说段是可执行程序的组成部分。
  代码段:代码段就是程序中的可执行部分,直观理解代码段就是函数堆叠组成的。
  数据段(也被称为数据区、静态数据区、静态区):数据段就是程序中的数据,直观理解就是c语言程序中的全局变量。(注意:全局变量才算是程序的数据,局部变量不算程序的数据,只能算是函数的数据)
  bss段(又叫ZI(zero initial)段):bss段的特点就是被初始化为0,bss段本质上就是属于数据段,bss段就是被初始化位0的数据段。
注意区分:数据段和bss段的区别和联系;二者本来没有本质区别,都是用来存放c程序中的全局变量的。区别在于把显示初始化位非零的全局变量存在.data段中,而把显式初始化位0或者并未显式初始化(C语言规定未显式初始化的全局变量默认为0)的全局变量存在bss段。


有哪些特殊的数据会被放到代码段
char *p = "linux";
// 定义字符串时,字符串"linux"实际被分配在代码段,也就是说这个"linux"字符串实际上是一个常量字符串而不是变量字符串。

const型常量:
  c语言中const关键字用来定义常量,常量就是不能被改变的量。
  const的实现方法至少有2种:
  第一种就是编译将const修饰的变量放在代码段去以实现不能修改(普遍见于各种单片机的编译器)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值