我可以假设 C/C++ 结构指针总是指向第一个成员吗?
示例 1:
typedef struct {
unsigned char array_a[2];
unsigned char array_b[5];
}test;
//..
test var;
//..
在上面的例子中 &var 总是指向 array_a 吗?
同样在上面的例子中,是否可以转换指针
到一个 unsigned char 指针并分别访问每个字节?
示例 2:
function((unsigned char *)&var,sizeof(test));
//...
//...
void function(unsigned char *array, int len){
int i;
for( i=0; i<len; i++){
array[i]++;
}
}
这能正常工作吗?
注意:我知道字符在结构中是字节对齐的,因此我假设上述结构的大小是 7 个字节。
最佳答案
对于 C 结构,是的,您可以依赖它。这就是几乎所有“面向对象”风格的 API 在 C 中的工作方式(例如 GObject 和 GTK)。
对于 C++,您只能将其用于“普通旧数据”(POD) 类型,这些类型保证以与 C 结构相同的方式在内存中布局。究竟什么构成 POD 类型有点复杂,并且在 C++03 和 C++11 之间发生了变化,但关键是如果你的类型有任何虚函数,那么它就不是 POD。
(在 C++11 中,您可以使用 std::is_pod
在编译时测试结构是否为 POD 类型。)
编辑:这告诉您什么构成了 C++ 中的 POD 类型:http://en.cppreference.com/w/cpp/concept/PODType
EDIT2:实际上,在 C++11 中,它不需要是 POD,只是“标准布局”,这是一个稍微弱一些的条件。根据标准第 9.2 节 [class.mem] 第 20 段:
A pointer to a standard-layout struct object, suitably converted using a reinterpret_cast, points to its initial member (or if that member is a bit-field, then to the unit in which it resides) and vice versa. [ Note: There might therefore be unnamed padding within a standard-layout struct object, but not at its beginning, as necessary to achieve appropriate alignment. — end note ]
关于c++ - 指向 POD 结构的 C/C++ 指针也指向第一个结构成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19786013/