我正在读K& R.在一个例子中,它将结构数组定义为:
struct key {
char * word;
int count;
} keytab[] = {
"auto", 0,
"break", 0,
/*more members*/
"while", 0
};
然后计算数组的大小,它使用两种方法:
1) #define NKEYS (sizeof keytab/ sizeof(struct key))
2) #define NKEYS (sizeof keytab/ sizeof keytab[0])
然后它说第二种方法的优点是如果类型改变则不需要改变它。有人能告诉我这最后一行的含义吗?这里有什么好处被讨论?
答案 0 :(得分:4)
如果将来将keytab
数组更改为与struct key
不同的类型,则必须更改第一行sizeof,因为类型是明确写入的。第二个sizeof行将保持工作,因为它没有命名类型,但采用任何类型的数组元素。
答案 1 :(得分:2)
“有人可以告诉我最后一行的含义吗?”
真的很简单。当您声明某个(某事物)数组时,每个元素都是该类型的sizeof
。 (例如int array[10] = {0};
声明并初始化一个10个元素的int
数组。数组的每个元素都有sizeof (int)
。
您可以使用array[x]
(其中x是0-9
)访问每个元素。任何元素,例如array[0]
是int
。 (正如*array
是对第一个元素的引用 - array[0]
在指针表示法中只是*(array + 0)
,当然只有*(array)
或{{1因为括号是不必要的)。
回到*array
数组的大小。 struct
给出数组中的总字节数。 sizeof keytab
给出每个元素中的字节数。因此sizeof keytab[0]
是数组中元素的数量。这与撰写sizeof keytab / sizeof keytab[0]
或sizeof keytab / sizeof *keytab
。
为什么呢?因为sizeof keytab / sizeof (struct key)
只是sizeof keytab[0]
。但是,如果您根据sizeof (struct key)
调整元素数量然后更改类型,那么使用sizeof (struct key)
的所有代码都会出错,但如果您使用sizeof (struct key)
调整大小,则代码将继续计算出正确数量的元素,因为您根据sizeof keytab[0]
而不是sizeof "an element"
来计算。
答案 2 :(得分:2)
1)代码需要假设我们正在查看sizeof (an arbitrary type name)
类型的成员数组
2)代码不需要知道。
出于可维护性原因,这被认为是2)的优点 考虑几个从事该项目的人,一个将数组的定义更改为
struct key
并将struct key2 {
char * word;
int count;
int coolness;
} keytab[] = /* ... */
的定义与您的代码完全相同。另一个负责具有大小宏定义的代码部分。
然后1)变得错误,但2)保持正确 因此1)需要两个开发人员之间的额外同步,这意味着额外的努力和错误的风险。
答案 3 :(得分:0)
有人可以告诉我最后一行的含义吗?
获取类型为struct key
这里有什么好处?
除了不明确依赖某种类型的优势之外,
编译器可以使用实际定义对宏进行更多优化。与sizeof(var)
相比,sizeof(type)
优化得更好。