关于结构体成员在结构体中的偏移位置,求教

来源:百度知道 编辑:UC知道 时间:2024/05/24 04:54:46
#include <stdio.h>
#include <stdlib.h>

struct test_s
{
int pad1;
int pad2;
int pad3;
int pad4;
int pad5;
int pad6;
int pad7;
int pad8;
int pad9;
int pad10;
int pad11;

};

int main(int argc, char *argv[])
{
struct test_s t = NULL;

printf("%d\n", (int)&(t->pad9));

return 0
}

为什么可以这样写呢(int)&(t->pad9),编译器不会认为这是在取t的元素pad9么?还有其他的方法没有?
代码通不过编译,有两个地方,一个是t的定义,应为struct test_s *t = NULL;应为一个指针,上面写错了,另外 return 0后面要加分号。

因为你把t定义成了一个结构体指针,并且指向为0的起始地址。
struct test_s *t = NULL;这句执行完以后,t->pad0的地址就是0x00000000这个单元。因为结构体中成员都是int型的,所以t->pad1的地址为0x00000004,依次类推t->pad9的地址就是0x00000020
&这个是一个取址运算符,&(t->pad9)意思是取t->pad9的地址,然后再转换成int型,输出32 。

如果没有把t定义成NULL,如下例子,打印出来的地址就是相对于sss的地址了。
int main(int argc, char *argv[])
{
struct test_s sss;
struct test_s *t = &sss;

printf("%d\n", (int)&(t->pad2));

return 0;
}

t不是指针,为什么可以进行t->pad9这个操作?
如果t是指针,初始化为NULL,又怎么能进行t->pad9操作?
这段代码通不过编译的

&(t->pad9)是一个长整型地址,是指针型的,用(int)是将其转化为整形。但是这样得到的只是pad9在内存中的地址,而不是相对于结构体的偏移位置。
偏移位置要用
(int)((char *)&(t->pad9)-(char *)&t)