您可以使用指向包含结构的指针来修改嵌套结构的值吗?

标签 c pointers struct portability c11

我有一个关于 C 中结构行为的问题。

以给定的结构为例:

typedef struct {
    char num1;
    char num2;
} structa;

typedef struct {
    structa innerstruct;
    char num3;
    char num4;
} structb;

我假设由于 structb 包含一个 structa 字段,而不是指向该字段的指针,因此 structb 将在内存中布局如下:

struct {
    char num1; //innerstruct num1
    char num2; //innerstruct num2
    char num3; //num3
    char num4; //num4
};

如果是这样,您可以像这样访问每个字段吗?

*(((char *)&structbvar) + 0) = 1; //innerstruct num1
*(((char *)&structbvar) + 1) = 2; //innerstruct num2
*(((char *)&structbvar) + 2) = 3; //num3
*(((char *)&structbvar) + 3) = 4; //num4

或者像这样访问它们?

((structa)structbvar).num1 = 1; //innerstruct num1
((structa)structbvar).num2 = 2; //innerstruct num2

无论这是否是不好的做法。

它可靠/便携吗?

<小时/>

编辑,正如 Matt McNabb 所指出的,你不能直接转换结构,所以它应该是:

((structa *)&structbvar)->num1 = 1; //innerstruct num1
((structa *)&structbvar)->num2 = 2; //innerstruct num2

最佳答案

*(char *) 版本定义明确,但您需要在 innerstruct 末尾和 num3 之前检查填充情况>.

(structa)structbvar 格式不正确。我认为 *(structa *)&structbvar 就可以了,因为关于具有共同初始序列的结构的规则(尽管我会仔细检查并更新我的答案)。然而,这有点毫无意义,因为你可以只写 structbvar.innerstruct

关于您可以使用指向包含结构的指针来修改嵌套结构的值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29454015/

相关文章:

c - 在动态数组中搜索

swift - 从 osx keychain 中检索 key

康威的生命游戏问题更新板

c - 将内存分配给双指针?

c++ - 根据 C/C++ 标准, "'“与 "\' 相同”吗?

c++ - 指向集合或 vector 中对象的指针——重要吗?

ios - 键值 : on packed struct?

c++ - 为什么我们需要 C++ 中的 `class`,而 `struct` 可用于实现相同的目的?

c++ - Arduino相当于VB WITH

c++ - 每个连接需要多少套接字?