我有一个关于 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/