阅读下面的代码,判断 a 中哪些元素被改变了,解释原因。


#include<stdio.h>
struct node{
    char a;
    int b;
    short c;
};

struct n{
    char a;
    int b;
};

int main(int argc,char*argv[])
{
    struct node a[2]={{1,2,3},{4,5,6}};
    *(int *)((char*)a+2*sizeof(struct n))=100;
    for(int i=0;i<2;i++)
        printf("%d ",a[i]);
    return 0;
}

a[1][1]被改变,也就是5变成了100
具体解释如下:

    2*sizeof(n)=2*8=16;
    (char*)a+2*sizeof(struct n)这里相当于a从首地址移动16个字节
    sizeof(node)=12(字节补齐4+4+4),也就是一个node结构体元素占12个字节
    所以,从a移动16个字节后,正好到a[1].b的首地址
    所以,*(int *)((char*)a+2*sizeof(struct n))=100就等价于a[1].b=100
    也就是5变成100