面试题1

来源:互联网 发布:数据防泄漏国内厂家 编辑:程序博客网 时间:2024/05/19 22:46

有以下代码:

struct A{    bool b;    int arr[2];    int i;    int j;};int main(){    A a;    a.b = false;    a.arr[0] = 1;    a.arr[1] = 2;    a.i = 20;    a.j = 30;    *(a.arr + 1) = 40;    A*p = 0;    unsigned int q = (unsigned int)(&p->i));    (*(int*)((char*)&a +q)) = -50;     return 0;}

当main函数返回之前,请问以下哪些说法是错误的:( )

A a.b的值是false
B a.arr[0]的值是1
C a.i的值是20
D a.j的值是30

答案:C

解析:
A:a.b的值从来没有改变过,因此为false
B:a.arr[0]的值也没有改变过,因此为1,而*(a.arr + 1) = 40;一句修改的是a.arr[1]的值
C:p的地址为0,那么&p->i的地址为12,相当于i相对于结构体头地址的偏移量为12个字节,(char*)&a +q自然就指向的a中i的地址,i被修改为-50
D:a.j的值也没有改变过,为30