我有一个名为 Characters
的结构,一个名为 a
的结构变量,以及一个名为 pChar
的指向 char 的指针,我想通过pChar
FirstChar
的值改为27
struct Characters {
short CharCount;
char FirstChar;
char SecondChar;
char ThirdChar;
};
struct Characters a = {3, 4, 5, 6};
char* pChar;
pChar = (char*)&a;
*(pChar+2) = 27;
我可以将结构 a 安全地转换为 char*
吗?填充会被添加到结构的末尾吗?如果我使用 *(pChar+2)
是否可以保证它指的是 FirstChar
?
最佳答案
Can I safely cast the struct a to char* safely?
Actor 本身是安全的。访问指针 *(pChar+2) = 27;
的内容是不安全的。形式上它可能会调用未定义的行为,因为它违反了 aliasing .
(就别名规则而言,使用 char* 很好,但是当将值 27 写入随机字节时,形式上无法保证结果是什么。您可能正在写入填充字节.)
And will the padding be added to the end of the struct?
可以在结构中的任何位置添加填充,但最开始除外。
在实践中,做这样的事情可能相当安全,即使它不被推荐并且是正式未定义的行为。我还没有遇到过无法安全且确定地工作的系统。但是你必须确保没有填充:
struct Numbers {
short CharCount;
char FirstChar;
char SecondChar;
char ThirdChar;
};
static_assert(sizeof(struct Numbers) ==
sizeof(short) +
sizeof(char) +
sizeof(char) +
sizeof(char),
"Padding found");
要实际禁用填充,通常有一些非标准的方法,例如 #pragma pack(1)
。
编辑
可靠地获取结构成员地址的最佳和最便携的方法可能是这样的:
#include <stddef.h>
struct Numbers x;
char* ptr = (char*)&x + offsetof(struct Numbers, FirstChar);
关于您可以将 struct 指针转换为 char 指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30474599/