C程序注意点
参考网址:
https://mp.weixin.qq.com/s/sgWvpKMqetU6l6th4SRJ9A
意想不到的八进制
1 | // b为八进制 |
指针加减运算
1 | int a=1; |
比如RAM初始化零操作,如下,只有4字节空间被初始化为零
1 | unsigned int *pRAMaddr; //定义地址指针变量 |
关键字sizeof
sizeof是一个关键字,需要注意的是,使用sizeof获取数组长度时,不要对指针应用sizeof操作符.
1 | void ClearRAM(char array[]) |
结构体填充
结构体可能产生填充,因为对大多数处理器而言,访问按字或者半字对齐的数据速度更快,当定义结构体时,编译器为了性能优化,可能会将它们按照半字或字对齐,这样会带来填充问题。比如以下两个结构体:
第一个结构体:
1 | struct { |
第二个结构体:
1 | struct { |
这两个结构体元素都是相同的变量,只是元素换了下位置,那么这两个结构体变量占用的内存大小相同吗?
其实这两个结构体变量占用的内存是不同的,对于Keil MDK编译器,默认情况下第一个结构体变量占用8个字节,第二个结构体占用12个字节,差别很大。第一个结构体变量在内存中的存储格式如图所示:
1 | 1~4字节 cc填充SSSS |
第二个结构体变量在内存中的存储格式如图所示。对比两个图可以看出MDK编译器是是怎么将数据对齐的,这其中的填充内容是之前内存中的数据,是随机的,所以不能再结构之间逐字节比较;另外,合理的排布结构体内的元素位置,可以最大限度减少填充,节省RAM。
1 | 1~4字节 cc填充 |
https://peitianyu.github.io/blog/2021/11/01/c%E8%AF%AD%E8%A8%80%E7%BC%96%E5%86%99%E6%B3%A8%E6%84%8F/
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 某飞行员的随笔!