*(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
[解决办法][解决办法]通过偏移量寻址结构体元素。
个人感觉这个程序旨在帮助理解C结构体的实际内存分配状况,并不是刻意炫耀“技巧”。
PS:
这个程序只代表了32位系统的情况,更通用的写法是:
*(int*)((char*)&a)=5;
*(int*)(((char*)&a)+sizeof(int))=7;
*(int**)(((char*)&a)+2*sizeof(int))=&a.data2;
[解决办法][解决办法]首先从最里面的圆括号看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。
[解决办法]通过结构体中地址的偏移量来给结构体赋值
[解决办法]将a偏移某个数值后的值强制转换成int类型
[解决办法]*(int*)(((char*)&a)+8) == *((int *)((char*)&a)+8*sizeof(char)))
这种赋值通常需要考虑 内存对齐的 问题.不建议使用
[解决办法][解决办法]你画个图----将结构变量的内部结构画出来,从&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