gpt4 book ai didi

您可以将 struct 指针转换为 char 指针吗?

转载 作者:太空宇宙 更新时间:2023-11-04 00:20:43 25 4
gpt4 key购买 nike

我有一个名为 Characters 的结构,一个名为 a 的结构变量,以及一个名为 pChar 的指向 char 的指针,我想通过pChar

将a中 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com