还是深信服的题目,连续两轮技术面试,都反复问到这个问题。虽然说是考察内存对齐的点,但是被我自己聪明反被聪明误了。比如:
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;这里看到,在’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 表示八字节
新闻热点
疑难解答