C语言程序,求解释

#include "stdio.h"
struct st_t
{
int status;
short *pdata;
char errstr[32];
};
void main()
{
struct st_t st[16];
char *p=(char *)(st[2].errstr+32);
printf("%d\n",(p-(char *)(st)));
}

定义了结构体,主程序是 先定义一个结构体数组 ,使p指向结构体数组的第3个元素的最后一个地址+1,输出 结构体 前三个元素占有的地址空间 大小
个人理解 你可以运行一下看看是什么结果
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-08-07
我的看法,不一定对哦:

#include "stdio.h"
struct st_t //声明结构体,长度2+2+32
{
int status; 声明status
short *pdata;
char errstr[32];
};
void main()
{
struct st_t st[16]; 声明数组st,有16个元素,,每个 元素的结构是struct st_t
char *p=(char *)(st[2].errstr+32); p的地址,指向 数组st的第3个元素中的字符数组errstr中的字符加上32 装换的 地址
printf("%d\n",(p-(char *)(st))); // 输出 p的地址-结构体的地址
}本回答被提问者和网友采纳
第2个回答  2011-08-07
#include "stdio.h" // 导入头文件

// 定义一个结构
struct st_t
{
int status; // 结构里包含个int
short *pdata; // 结构里包含个short指针
char errstr[32]; // 结构里包含个char型数组,数组大小为32
};

// 主函数
void main()
{
struct st_t st[16]; //定义16个st_t

char *p=(char *)(st[2].errstr + 32); // st里的第三个结构的errstr数组的地址加上32 算出来的结果赋给p

printf("%d\n",(p-(char *)(st))); // p减去st数组的地址 让算出的结果显示出来
}
第3个回答  2011-08-07
#include "stdio.h" //包含标准的输入输出库stdio.lib
struct st_t //声明一个结构体,名叫st_t
{
int status; //该结构体中包含一个int类型的变量:status
short *pdata; //该结构体还包括一个short类型的指针:pdata
char errstr[32]; //该结构体重还有个char类型的数组:errstr[32],数组大小为32个字节
};
void main() //主函数
{
struct st_t st[16]; //先定义个结构体(就是上面声明的那个)数组,名字叫做st[16],其中包
//含16个元素(也就是说有16个这样的结构体)
char *p=(char *)(st[2].errstr+32); //定义一个char类型的指针,并让该指针指向刚刚定义的那
//个结构体数组中,其中st[2].errstr+32,意思为指向该结构
//体第三个元素的errstr且再向后偏移32未,实际上就是指向
//了第四个元素的开头即:st[2],而(char *)意思则是将其
//强制转换为char类型的指针
printf("%d\n",(p-(char *)(st))); //最后是打印,将刚刚得到的指针向前偏移一个struct st_t结
//构体的长度,来进行打印,最后会打印出st[2].errstr的值
}

ps:由于你对struct st_t st[16];没有赋初值,所以在win32下应该打印结果为0

打字好累,望采纳追问

值是108,但好像还是不对,这是百度公司的一道笔试题,选项里面没有108这个数,我认为输出的是两个地址之间的差值,你再看一下,谢谢

相似回答