我試圖確保我明白這裏隱藏的假設是什麼。在結構體中的「char」之後是否有零字節?
此處的代碼給出了正確的結果。
#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
有人可以證實我的懷疑,認爲這隻能是因爲兩件事情:
- 結構成員得到在n字節邊界對齊(N! = 1)(n = 4,看起來,當詢問sizeof() - s)
- 第一個成員(它是一個
char
)未使用的字節直到n字節邊界爲零。
我沒有看到printf工作正常的其他解釋,否則,因爲它期望一個零終止的char []。此外,做這樣的事情是明智的(在單目標嵌入式代碼情況之外,其中優化可能超過可讀性和可移植性問題),也就是說,這些假設或多或少是普遍真實的嗎?
第一週間歇性地與C打交道,所以我很綠。
'的printf(T->標誌)保證假設;'確實是醜陋的(它依靠。 .flag字段之後的字符爲nul;這是不能保證的)'printf(「%c」,t-> flag);'可能是標準的方式。 – wildplasser 2014-10-05 10:47:31
我的第一個膝蓋反射是它稍微快了一點(我跑了一次,而%c版本以4倍的時間完成)。我再次嘗試,結果是早先的結果是虛假的。我猜這樣做沒有什麼可勝利的。 – Jostikas 2014-10-05 12:41:27
出於好奇:這段代碼來自哪裏?我沒有理由不正確地使用'printf'(正如Wildplasser所建議的),或者使用'putchar'。 – mafso 2014-10-05 12:42:34