当前位置: 首页 > news >正文

C 语言的骚操作

我开始也是怀疑这个是不是能够运行起来,就写了一段测试程序。

代码语言:c

AI代码解释

#include <stdio.h> typedef struct test{ char ch; int number; }*Test; int main(){ int a = (int)&(((Test)0)->number); printf("%d\n", a); return 0; }

上述代码只要熟悉 c 语言的基本都能看得懂,对代码进行编译时候编译也通过了。

编译代码

编译器只是对编译过程做出了警告,并没有报 error ,所以语法层面是可以编译成功的。

那么既然可以运行那么有人直到结果是什么吗?

在得出结果前,我们先看一下这段代码是干什么的,首先(Test)0 是将 0 强制转化为一个指向 test 结构体的指针。

然后 ((Test)0)->number 指向了结构体的 number,其实就是相当于指向了 number 的首地址。因为空指针的初始地址是 0那么这个指针的地址就是这个 number ,在结构体中的地址偏移。

既然直到这段是在求 number 在结构体中的地址偏移,那么他的代码输出结果是什么?

这就要提到结构体的占用内存的方式。

我们直到 char 占用 1 个字节,int 占用 4 个字节,那么这个结构体是不是占用 5 个字节?

内存对齐

算法的性能可以用空间复杂度和时间复杂度来评估,而 C 语言结构体很多设计也是空间复杂度和时间复杂度之间的取舍,结构体在使用过程中并不是一个字段地址挨着一个字段地址访问,而是为了访问效率进行内存对齐的操作

一般内存对齐都是 4 字节对齐,所以上述结构体大概的一个占用内存结构如下:

内存占用

明白了上述内存对齐,那么number 的地址在结构体中的内存偏移我们就知道了,所以输出是 4。

但是如果我就是叛逆,我管你什么性能的,我看到空间浪费我就难受,对于穷孩子出身的我就算这饭吃了拉肚子我还是不扔怎么办?

设置内存对齐方式

内存对齐是编译器的默认的一种方式,如果想要禁止内存对齐或者自己设置内存对齐方式那么可以这样。

既然是编译器的一种设置方式,那么针对不同平台的语法也不一样,在 Linux 平台下使用attribute((packed)) 和attribute((aligned(4))) 来进行内存对齐,在结构体语言中就是

代码语言:c

AI代码解释

typedef struct __attribute__((packed)) test { char ch; int number; } *Test;

修改后输出就是 1 了

当然也可以自己设置对齐方式,比方说如果设置为 8

代码语言:c

AI代码解释

typedef struct __attribute__((aligned(8))) test { char ch; int number; } *Test;

这次输出什么呢? 很多人会认为是 8,但是实际大多可能是 4,这跟编译器有很大关系,编译器优化,默认对齐设置等等有关,所以自己设置对齐方式一般小于 4

Windows 平台也有优化选项

代码语言:c

AI代码解释

#pragma pack(push, 1) typedef struct test { char ch; int number; } *Test; #pragma pack(pop)

如果不加 push 后边也不同 pop ,不过这样选择就是对后边所有结构体都进行了内存对齐设置了。

另外如果只针对某一个成员变量设置对齐方式,那么可以这样写。

代码语言:c

AI代码解释

typedef struct test { char ch; int number __declspec(align(1)); // 设置 number 成员的对齐为 1 字节 } *Test;

可以看到Windows下编译器对结构体控制粒度更细。

http://www.jsqmd.com/news/458336/

相关文章:

  • 基于LLM的学术论文摘要生成与核心观点提取系统毕业设计源码
  • C 语言赋能:物联网环境下人工智能应用的能耗优化之道
  • 数字病理分析必备技能:5分钟学会用pyvips高效转换mrxs到SVS(附TIF双方案)
  • 【C语言】sizeof 关键字详解
  • 基于SpringBoot的DeepSeek-demo 深度求索-demo 支持流式输出、历史记录
  • Flutter 组件 clipper2 适配鸿蒙 HarmonyOS 实战:高性能几何裁剪,构建工业级多边形布尔运算与路径治理架构
  • 【Linux网络】传输层协议UDP
  • 2026年忻州源头钢结构厂家价格大揭秘,按需定制费用多少? - 工业品网
  • Linux camera驱动开发(ARM、FPGA、DDR共享总线)
  • Linux将多条指令合并为一条执行
  • C++多态:动态绑定的核心机制
  • 初识MySQL · 库的操作
  • 细聊2026年科学仪器展会服务,实验室仪器展会怎么选择靠谱的 - 工业品牌热点
  • Flutter 组件 native_shuttle 的适配 鸿蒙Harmony 实战 - 驾驭极致原生通讯性能、实现鸿蒙端 Dart 与 ArkTS 之间的高频底层穿梭方案
  • Flutter 组件 conventional 适配鸿蒙 HarmonyOS 实战:约定式提交标准,构建自动化版本治理与 CI/CD 质量治理架构
  • 本地GEO推广好用吗,湖南有哪些值得推荐的渠道商 - 工业设备
  • 基于Spring Cloud的电商系统设计与实现——用户与商品模块的研究(上)
  • Harmonyos应用示例40. 复习和关联:知识网络图
  • 【Linux】Linux第一个小程序 - 进度条
  • 从实验室到万吨产线:青岛福尔蒂以校企联合将博士论文转化为抗静电母粒量产方案
  • 用实力说话!降AIGC软件 千笔AI VS 文途AI,本科生专属推荐
  • 5 分钟手把手教你打造 AI 知识库!附 OpenClaw「龙虾」养成指南(建议收藏)
  • 存储过程(SQL)
  • openclaw 常用命令
  • 【Linux】深入浅出 Linux 自动化构建:make 与 Makefile 的实用指南
  • C语言进阶指南(类型转换、整型提升)
  • 显卡(Graphics Processing Unit,GPU)架构详细解读
  • 学生成绩管理系统(MySQL)
  • 基于Spring Cloud的电商系统设计与实现——用户与商品模块的研究(下)
  • 完美解决org.mybatis.spring.MyBatisSystemException nested exception is org.apache.ibatis.reflection.Refl