内存管理|memcmp比较两个struct是否相等

struct MyStruct { char a; int b; }; MyStruct A, B; memcmp(&A, &B, sizeof(MyStruct));

A和B是否可以通过memcmp来判断是否相等。我一直以为虽然要内存对齐,但是a后面会补三个’\0’所以还是可以判断是否相等的。真是迷之自信!这个问题其实最主要是考察你要知道内存对齐,MyStruct的实际大小是8就够了。然后未初始化的全局变量,static变量,编译器会自动初始化为0。但是局部变量的值是不确定的,必须先赋值再使用。虽然全局变量,static变量可以不初始化,但是建议还是保持好习惯,所有的变量都要先初始化再使用!所以,这里char a后面3个字节不知道原本内存中是什么数据,那么A和B是没法进行比较是否相等的!我们不妨gdb调试看看内存中的情况:
MyStruct A; A.a = 'a'; A.b = 10;

【内存管理|memcmp比较两个struct是否相等】内存管理|memcmp比较两个struct是否相等
文章图片

这里看到,在’a’后面3个字节分别是’\344’ ‘\377’ ‘\377’,后面补齐的内容不确定,那么就造成了memcmp不能判断是否相等。
用gdb查看内存
格式:x /nfu
说明:
x 是 examine 的缩写
n 表示要显示多少个内存单元
f 表示内存单元显示方式,可取如下值:
x 按十六进制格式显示变量
d 按十进制格式显示变量
u 按十进制格式显示无符号整型
o 按八进制格式显示变量
t 按二进制格式显示变量
a 按十六进制格式显示变量
i 指令地址格式
c 按字符格式显示变量
f 按浮点数格式显示变量
u表示一个内存单元的长度
b 表示单字节
h 表示双字节
w 表示四字节
g 表示八字节

    推荐阅读