typedef struct {
int a;
short s[2];
} MSG;
MSG *mp, m = {4, 1, 0};
char *fp, *tp;
mp = (MSG *) malloc(sizeof(MSG));
for (fp = (char *)m.s, tp = (char *)mp->s; tp < (char *)(mp 1);)
*tp = *fp ;
所以我從我對 c 編程的記憶中得出結論,第一個塊是使用 typedef 定義別名的結構宣告。別名是味精?Next 指標 *mp 和 struct m = {4, 1, 0} 被宣告為 MSG 型別。接下來創建兩個 char 指標,*fp 和 *tp。mp 設定為等于 malloc(sizeof(MSG)) ,它被強制轉換為型別 (MSG *) 或指向 MSG? 的型別指標。接下來設定一個for回圈,其中for fp = ms(可以說是struct m中的s)轉換為指向char的指標,tp = pointer mp set to struct s; 和 tp < (char *)(mp 1) 或指標加 1);)
我真的不確定,因為此時我對 c 的記憶非常模糊。有人可以糾正我或更好地闡明這段代碼在做什么嗎?我試圖辨別我是否準備好開始學習某本書,這是第一塊代碼。接下來,無論指標 fp 指向什么,都會遞增設定為也遞增的 *tp。
uj5u.com熱心網友回復:
將評論轉換為答案。
- 是的;
MSG是別名。 - 是的,
mp是一個未初始化的指標,m是一個已初始化的MSG結構。 - 是的,
fp并且tp是char *變數。 - 強制轉換在 C 中不是必需的,但在 C 中是必需的。
- 然后代碼會寫出 memcpy() — 或多或少。
可以寫成:
memmove(mp->s, m.s, sizeof(m.s));
(或者你可以使用memcpy()——不過我不使用它)。回圈的(char *)(mp 1)限制是分配結構之后結構的開始。
代碼也可以寫成:
mp->s[0] = m.s[0];
mp->s[1] = m.s[1];
這甚至可能更快。事實上,它可以簡單地寫成:
*mp = m;
它確實初始化mp->a了,但無論如何都不應該長時間未初始化。如果m不再使用該結構,則代碼可以消除變數并撰寫:
*mp = (MSG){ .a = 4, .s = { 1, 0 } };
使用復合文字和指定的初始化程式,兩者都需要支持 C99 或更高版本。
有很多方法可以改進該代碼片段。這讓人們想知道這是否是一本值得學習的好書。對書中的不恰當之處保持懷疑的態度可能是值得的。如果它是在中期(200 倍)或上個千年寫成的,那么寫的東西會有更好的借口,但是這么古老的書值得一??讀嗎?(那個時代的一些書仍然值得一讀——見下面的評論。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/439023.html
