C语言&嵌入式踩坑

1-结构体字节对齐

假设有这样一个结构体

typedef struct

{

  u16 emission;

  u16 cylinder_num;

}motor engine;

此结构体在内存中的存储方式为

Byte    0       1

   #  # (u16 emission)

      #  # (u16 cylinder_num)

这是 2 Byte 对齐的

若在内存中要求为 4 Byte 对齐的情况下,可能会导致内存踩踏

可将其修改为

typedef struct

{

  u16 emission;

  u32 cylinder_num;

}motor engine;

此时在内存中的存储方式为

Byte    0       1

   #  #          (u16 emission)

      #  #  #  #  (u32 cylinder_num)

这是 4 Byte 对齐的,可避免内存踩踏

相关知识关键词:结构体字节对齐

 2-不同长度变量强转

Byte 3 2 1 0

   # # # #  (u16)

    # #  (u8)

u16 强制转换为 u8 的过程,是直接取 Byte 3 2 的数据,即将u16右移8位得到 u8,同理 u32 转 u16 、u64 转 u32 也是同理

 

3-堆和栈的区别

 

 

 

4-volatile 能在函数参数中定义吗

 

volatile 能修饰函数参数‌,这在 C/C++ 里是合法的,不过用法上有讲究。

 

volatile 修饰函数参数时,效果跟修饰普通变量一样——告诉编译器这个参数的值可能被外部因素(硬件、中断、其他线程)意外修改,所以每次访问都必须从内存重新读取,不能做优化。

 

但实际开发中,‌更常见的是用 volatile 修饰指针参数‌

 

posted @ 2022-07-06 10:39  大咖喝咖  阅读(69)  评论(0)    收藏  举报