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

标签 c

我有一个名为 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/

相关文章:

c - 如何在 'a' 和 'z' 之间移动几个字母

c - 可以使传递的指针为空的函数

c - 优化一个c函数去掉compare

c - C语言中的字符串输入问题

c - 为什么这个质因数分解算法有缺陷却给出了正确的答案?

将 double 转换为整数以提高速度

c - 在 visual studio 中构建程序

c - 程序输出与手动计算不同,为什么会出现这种情况? C语言

c - 使用 execvp 传递参数

C - 缓冲区溢出详细信息