2015-04-05 52 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不是字符类型,将由违反严格别名规则导致未定义的行为。这段代码没有这样做,但大概是使用这个函数的调用代码会在某个阶段取消引用返回的指针。

相关问题