c++ - 指向 POD 结构的 C/C++ 指针也指向第一个结构成员

标签 c++ c pointers struct

我可以假设 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/64950207/

相关文章:

pointers - 将 unique_ptr/shared_ptr 与 API 函数结合使用,通过指针将资源作为输出参数返回

C++访问数组元素

c++ - If 语句:值列表

java - 我们说 "ints are immutable"到底是什么意思

c - 从不兼容的 void * 分配 int*

代码遇到段错误错误。如何修复?

c++ - *& 在 void headInsert(DoubleLinkList*& head, int theData) 中是什么意思。它是否等同于 void headInsert(DoubleLinkList head, int theData)

C++指针数组结构

c - 如何从 C 文本文件中的字符串创建单独的实体?

c++ - 是否可以将常规指针转换为指向类字段的指针