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/19786013/

相关文章:

c++ - 在没有宏的情况下获取编译时日期和时间

c - 用户级程序应该捕获哪些 "fatal"信号?

c - 在这种情况下,char[] 和 char* 有何不同?

c - C语言系统调用挂载ecryptfs

c - C 中的正则表达式 (PCRE)

c - 通过指针理解间接并获取地址

c - 在函数调用期间将哪些值压入堆栈?

C++:boost::asio:async_resolve() 不起作用(使用 lambda 函数),但 resolve() 起作用

c++ - 将元素数量不断变化的 map 导出为 CSV

C++ 将数组打印到任何输出对象(按函数)