有关C指针和结构体

Tody Guo 2010-01-23 05:15:04

struct dmi_eps {
uint8_t anchor[4];
int8_t checksum;
uint8_t length;
uint8_t majorversion;
uint8_t minorversion;
uint16_t maxstructsize;
uint8_t revision;
uint8_t pad[5];
uint8_t intanchor[5];
int8_t intchecksum;
uint16_t tablelength;
uint32_t tableaddress;
uint16_t numstructs;
uint8_t SMBIOSrev;
};

char *dmi, *dmi_search_start, *dmi_start;
int found=0;
struct dmi_eps *eps;

//find anchor
for(dmi = dmi_search_start; dmi < dmi_search_start + 0xf0000; dmi +=16){
if( *dmi == '_' &&
*(dmi+1) == 'S' &&
*(dmi+2) == 'M' &&
*(dmi+3) == '_'){
found =1;
break;
}
}
if (!found) {
return -1;
}
dmi_start=dmi;、
eps=(struct dmi_eps *)dmi; /* 问题点1:这段代码的作用是什么呀?*/

}



请问,“问题点1:” 处的代码的作用是什么啊?是将dmi指针所指向的内容赋值给结构体eps吗?
如果是这样的话,那以后就直接可以使用eps结构体中的成员了吗?

希望能得到高手的指导与帮忙,谢谢先~~~~
...全文
169 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiatengxue 2010-01-23
  • 打赏
  • 举报
回复
不要看成是指针和结构体的问题,而是内存的操作问题。
versaariel 2010-01-23
  • 打赏
  • 举报
回复
取一段struct dmi_eps的内存数据
Tody Guo 2010-01-23
  • 打赏
  • 举报
回复
这个是memtest86+中的原代码,代码中就是这样些的。目前我想把它能抓起DMI信息的内容代码的部分转到到DOS(16bit)上。可是困难重重。。。
selooloo 2010-01-23
  • 打赏
  • 举报
回复
是将dmi指针所指向的内容赋值给结构体eps吗?
是的,这种使用类似于联合体
会将dmi指向的内存解释为结构体
超gogo 2010-01-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 walw521 的回复:]
1.dmi指针中的内容会和eps里面的结构是一样的
2.printf("%s",eps->anchor)这时eps->anchor为要打印的字符串的起始地址,当遇到 '\0'时结束打印!,如果你的结构体中没有'\0'的话,会打印结构体中剩余的所有元素!
[/Quote]
没错,这个问题要注意的!
超gogo 2010-01-23
  • 打赏
  • 举报
回复
结构体也就是顺序存储一片内存单元,dmi以及后面的三个指针存储四个“地址”大小,到时候会按顺序当成struct 的前四个“地址"大小的空间,正好是8*4=32 即uint8_t anchor[4];但是再往后的就会出现问题,你只用锚点数组应该没问题!
walw521 2010-01-23
  • 打赏
  • 举报
回复
1.dmi指针中的内容会和eps里面的结构是一样的
2.printf("%s",eps->anchor)这时eps->anchor为要打印的字符串的起始地址,当遇到 '\0'时结束打印!,如果你的结构体中没有'\0'的话,会打印结构体中剩余的所有元素!
swl82560397pq 2010-01-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tody_guo 的回复:]
还有个问题就是,dmi指针中的内容会和eps里面的结构是一样的吗?
那如果我输出printf("%s",eps->anchor);会不会出现问题该成员后的数据。
谢谢~~~
[/Quote]
干,吗非得这么强制转换呢。不推荐
另外你虽转换了,但并未完全赋值,这样,不能确定输出什么。
swl82560397pq 2010-01-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tody_guo 的回复:]
还有个问题就是,dmi指针中的内容会和eps里面的结构是一样的吗?
那如果我输出printf("%s",eps->anchor);会不会出现问题该成员后的数据。
谢谢~~~
[/Quote]
printf("%s",(*eps)->anchor);
超gogo 2010-01-23
  • 打赏
  • 举报
回复
struct dmi_eps *eps;中定义了eps是该结构体的指针。
eps=(struct dmi_eps *)dmi;这里是将dmi的类型强制转换,
你这样强制转化,我觉着应该会输出4个地址的
Tody Guo 2010-01-23
  • 打赏
  • 举报
回复
还有个问题就是,dmi指针中的内容会和eps里面的结构是一样的吗?
那如果我输出printf("%s",eps->anchor);会不会出现问题该成员后的数据。
谢谢~~~
swl82560397pq 2010-01-23
  • 打赏
  • 举报
回复
原来dmi是char指针,后来(struct dmi_eps *)dmi强制转换。并将其赋值给
eps
eps和dmi指向的内容一致。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧