sizeof运算符如何为结构工作

时间:2018-03-09 06:01:43

标签: c arrays structure

我正在读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])

然后它说第二种方法的优点是如果类型改变则不需要改变它。有人能告诉我这最后一行的含义吗?这里有什么好处被讨论?

4 个答案:

答案 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)优化得更好。