2015-04-05 47 views
3

我正在研究Understanding Unix/Linux Programming (Bruce Molay)的一些示例代碼。有一個數組宣佈舉行utmp的結構:爲什麼在這個例子中定義爲char的utmp結構數組?

#define NRECS 16 
#define NULLUT ((struct utmp *)NULL) 
#define UTSIZE (sizeof(struct utmp)) 

static char utmpbuf[NRECS * UTSIZE]; 

爲什麼人們會選擇聲明數組類型char而不是struct utmp,如下圖所示?

static struct utmp utmpbuf[NRECS]; 

實際的書的源代碼是在這裏:

+0

看起來像引導步驟給我。 utmp是一個二進制文件,您必須使用十六進制轉儲實用程序來查看其內容。所以一個粗略的猜測是,作者喜歡存儲在他的程序中的數據可以看到它在實用程序中的方式。這真的很重要嗎? – 2015-04-05 11:44:31

回答

1

此代碼可能是竊聽。存儲應該是:

static struct utmp utmpbuf[NRECS]; 

按照您的建議。至於爲什麼這本書寫了這個,你不得不問這些。我沒有看到任何可以想象的理由。

這個問題是來自企圖char數組別名struct utmp

recp = (struct utmp *) &utmpbuf[cur_rec * UTSIZE]; 

首先,char陣列可能無法正確的struct utmp對齊。如果它沒有正確對齊,則會導致未定義的行爲。

即使它是正確對準。然而,任何企圖利用*recp,或做recp->X其中X不是字符類型,將由違反嚴格別名規則導致未定義的行爲。這段代碼沒有這樣做,但大概是使用這個函數的調用代碼會在某個階段取消引用返回的指針。

相關問題