首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

*(int*)(((char*)&a)+零)的意思

2012-10-12 
*(int*)(((char*)&a)+0)的意思求高手讲解下下列代码的意思,尤其是*(int*)(((char*)&a)+0)及*(int*)(((char

*(int*)(((char*)&a)+0)的意思
求高手讲解下下列代码的意思,尤其是*(int*)(((char*)&a)+0)及*(int*)(((char*)&a)+8) = (int)&a.data2的意思

C/C++ code
    struct{        int data;        int data2;        int *p;    }a = {2,3,&a.data};    *(int*)(((char*)&a)+0) = 7;    *(int*)(((char*)&a)+4) = 5;    *(int*)(((char*)&a)+8) = (int)&a.data2;    printf("%d %d %d",a.data,a.data2,*a.p);


[解决办法]
int大小是4
*(int*)(((char*)&a)+0)是data
 *(int*)(((char*)&a)+8)是*p
[解决办法]
探讨
求高手讲解下下列代码的意思,尤其是*(int*)(((char*)&a)+0)及*(int*)(((char*)&a)+8) = (int)&a.data2的意思

C/C++ code

struct{
int data;
int data2;
int *p;
}a = {2,3,&a……

[解决办法]
通过偏移量寻址结构体元素。

个人感觉这个程序旨在帮助理解C结构体的实际内存分配状况,并不是刻意炫耀“技巧”。

PS:
这个程序只代表了32位系统的情况,更通用的写法是:
*(int*)((char*)&a)=5;
*(int*)(((char*)&a)+sizeof(int))=7;
*(int**)(((char*)&a)+2*sizeof(int))=&a.data2;
[解决办法]
探讨

通过偏移量寻址结构体元素。

个人感觉这个程序旨在帮助理解C结构体的实际内存分配状况,并不是刻意炫耀“技巧”。

PS:
这个程序只代表了32位系统的情况,更通用的写法是:
*(int*)((char*)&a)=5;
*(int*)(((char*)&a)+sizeof(int))=7;
*(int**)(((char*)&a)+2*sizeof(int)……

[解决办法]
首先从最里面的圆括号看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。

[解决办法]
通过结构体中地址的偏移量来给结构体赋值

[解决办法]
将a偏移某个数值后的值强制转换成int类型
[解决办法]
*(int*)(((char*)&a)+8) == *((int *)((char*)&a)+8*sizeof(char)))

这种赋值通常需要考虑 内存对齐的 问题.不建议使用
[解决办法]
探讨

引用:
引用:

看了各位大牛们的回复,更迷茫了:*(int*)(((char*)&a)+4)是为*(int*)(((char*)&a)+4*sizeof(char))还是*(int*)(((char*)&a)+sizeof(int))呢?
ps:指定的是4字节对齐

32位……

[解决办法]
你画个图----将结构变量的内部结构画出来,从&a确定各个成员的地址
char*即按内存的byte为基本度量,+若干byte后再转换为正确的指针类型--再间接访问

&a----结构a的首址
(char*)&a----转换为Byte地址
char*)&a+n----生成n个字节后的地址----某个成员的地址
(int*)(char*)&a+n)----转换为指向成员的指针类型
*(int*)(char*)&a+n)----按成员的类型访问

[解决办法]
结构内布局byte
|0123|4567|89AB|
|data|dat2|p---|
^

&a

热点排行