C语言语法难题

来源:百度知道 编辑:UC知道 时间:2024/05/22 03:38:10
typedef struct conninfo
{
int go;
int come;
char a;
} *Pconninfo;
int main(int argc, char* argv[])
{
char buf[10]="123456789";
int nTest=((Pconninfo)buf)->come;
printf("%d",nTest);
return 0;
}
请问((Pconninfo)buf)->come的值代表什么?

不考虑对齐的话,buf从低到高依次为字符1-9,最后是\0
然后,将buf强制转换成Pconninfo类型,再取里面的come,是第二个字段,如果是在16位环境下,int占2个字节,那就是3、4那个当成int,0x3433,那就是13363
在32位环境下,int占4个字节,那come是对应5678那个位置,那是
0x38373635,那就是943142453

就是指向结构体里面的come的值

Pconninfo是指针指向的是地址
struct内的数据是顺序存储的,
go完了是come然后a
buf里的数据也是顺序存储的
Pconninfo)buf强制转换,但指针指的还是那个地址
也就是说你算下地址,就应该知道了。

(Pconninfo)buf是强制类型转换。把从数组buf的首地址开始的一段内存强制转换成Pconninfo类型,

因为在前面使用了typedef ,实际上强制转换成的数据类型是 struct conninfo的指针。

在使用指针输出指针指向的结构体的私有变量时一般用(dd)->xx.的形式。
所以((Pconninfo)buf)->come的值最后代表的是经过强制类型转换后的123456789的内存空间转换成struct conninfo后所对应的come成员的值。

最后结果不确定,因为你并不知道具体是如何编码的。比较麻烦

这里是吧 buf(指向字节数组的指针)强制转换成 Pconninfo 型(指向 conninfo 结构体的指针)的变量,然后用该指针访问结构体里的数据。

结构体中 go 占用 4 个字节,come 占用 4 个字节,a 占用 1 个字节。
((Pconninfo)buf)->come 即为 buf 数组中 第 5~8 字节的数据,由Intel的机器中于高位存储高字节,所以 ((Pconninfo)buf)->come 为 0x38373635 ('8' '7' '6' '5' 的ASCII值) 即为