c - 如何使用简单的指针算法访问结构的属性?
问题描述
我有这个结构以及初始化它的方法:
struct Person
{
char name[32];
char lastn[32];
size_t year;
};
void init_pers(struct Person* p, const char* n, const char* ln, size_t y)
{
strcpy(p->name, n);
strcpy(p->lastn, ln);
p->year = y;
}
这就是它们的主要调用方式:
struct Person f;
init_pers(&f, "Alan", "Wake", 1995);
通过简单的指针算法,我能够打印出前两个属性:
printf("First field: %s\n", (const char*)&f); // prints 'Alan'
printf("Second field: %s\n", (const char*)&f + 32); // prints 'Wake'
但是,当我尝试同样打印第三个属性(即 size_t)时,我得到的数字不是年份:
printf("Third field: %lu\n", (size_t)&f + 64); // prints '6422317'
使用指针算术打印保存年份的内存空间的正确方法是什么?
解决方案
C 标准并没有真正指定结构成员的布局方式。可能有填充。
而不是假设year
结构中有 64 个字节,您应该使用offsetof(struct Person, year)
.
如果您需要更多地控制结构在内存中的布局方式,请查看打包结构。它不是标准的,但几乎所有编译器都支持它们,尽管语法不同。
也就是说,第三个 printf 并没有按照你的想法做。尝试类似的东西
*((size_t*) (((char*) &f) + 64))
使用您的原始代码,您尝试将地址 year
打印为 a size_t
,而不是值。
推荐阅读
- javascript - 记住页面重新加载后的复选框和单选按钮状态
- html - 使用 flex 将按钮放置在输入表单内
- php - 通过 PHP 脚本随机接收空邮件
- typescript - 如何使用 react-native-camera 进行实时姿势检测?
- flutter - 如何使用 imagepicker 显示选定的照片并上传到服务器?
- html - Datalist 下拉列表忽略特殊字符并过滤
- reactjs - 为什么我的底部选项卡导航器重新渲染是不必要的?
- intellij-idea - Intellij如何删除所有包含注释的行?
- c# - 在 asp.net 中无法正确重定向
- java - 如何解决 HackerRank 的 Gemstone 问题的最终测试用例