我试图确保我理解这里隐藏的假设是什么。
这里的代码给出了正确的结果。
#include <stdio.h>
#include <stdlib.h>
struct branch
{
char flag; //value
struct branch *l; //left child
struct branch *r; //right child
};
struct branch c={'c',NULL,NULL};
struct branch e={'e',NULL,NULL};
struct branch f={'f',NULL,NULL};
struct branch b={'b',&c,NULL};
struct branch d={'d',&e,&f};
struct branch a={'a',&b,&d};
void preorder(struct branch* t)
{
printf(&t->flag); //Seems ugly and errorprone
if(t->l) preorder(t->l);
if(t->r) preorder(t->r);
}
int main()
{
preorder(&a);
}
正如预期的那样,输出是abcdef
有人可以证实我的怀疑,这仅是因为两件事:
- struct 成员在 n 字节边界处对齐(n != 1)(n = 4,似乎,在询问 sizeof()-s 时)
- 第一个成员(即 a
char
)在 n 字节边界之前未使用的字节被归零。
我看不到 printf 正常工作的其他解释,因为它需要一个以零结尾的 char[]。
此外,这样做是否明智(在单目标嵌入式代码情况之外,优化可能超过可读性和可移植性问题),即。这些假设或多或少普遍正确吗?
第一周间歇性地弄乱 C,所以我很绿。