我试图在我的结构中将birthMonth变量的值设为cin。我的理解是结构成员按顺序存储。如果是这样,我无法找出为什么使用
行cin >> *((short*)((people) + sizeof(Person::name)));
不会将输入值存储到结构元素中。我对顺序存储结构的成员是否错误?
main.cpp
#include <iostream>
using namespace std;
struct Person {
char name[15];
short birthMonth;
};
int main() {
Person people[2];
cout << "Birth Month: ";
cin >> *((short*)(people + sizeof(Person::name)));
cout << people[0].birthMonth;
}
样品运行:
Birth Month: 7
0
Program ended with exit code: 0
答案 0 :(得分:3)
由于内存对齐和填充,C ++实际上不提供任何保证根据先前成员的累积大小来定位结构的成员。如果您要写第一个Person
的{{1}},它很简单:
birthMonth
编辑:实际上要解决问题的标题,如果您想要指向特定人员的cin >> people[0].birthMonth;
的{{1}}指针,则可以使用地址运算符完成此操作:
int*
但是,如果您想要指向 any birthMonth
的{{1}}成员的指针,则可以使用pointer-to-member:
int* birthMonth_ptr = &people[0].birthMonth;
还请注意,指向成员的指针与常规指针的键入方式不同,因此不能将其强制转换为一个指针。
答案 1 :(得分:1)
要了解为什么您的代码不起作用,请添加几行以打印几个地址。
short* ptr1 = (short*)(people + sizeof(Person::name));
short* ptr2 = &(people[0].birthMonth);
std::cout << "ptr1: " << ptr1 << ", ptr2: " << ptr2 << std::endl;
您会注意到,由于对齐要求,ptr1
和ptr2
是不同的。
进一步阅读:https://en.wikipedia.org/wiki/Data_structure_alignment。