繁体   English   中英

sizeof运算符如何用于结构

[英]How sizeof operator works for a 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])

然后,它说第二种方法的优点是,如果类型更改,则无需更改。 有人可以告诉我最后一行的含义吗? 在这里谈论什么优势?

如果将来您将keytab数组更改为与struct key不同的类型,则必须更改第一行sizeof,因为该类型是在此处明确写入的。 第二行sizeof行将保持工作状态,因为它没有命名类型,而是采用数组元素的任何类型。

有人能告诉我最后一行的含义吗?

真的很简单。 当您声明某物(任何东西)的数组时,每个元素都是该类型的sizeof (例如, int array[10] = {0};声明并初始化一个由10个元素组成的int数组sizeof (int) 。该数组的每个元素都具有sizeof (int)

您可以使用array[x] (其中x为0-9 )访问每个元素。 任何元素,例如array[0]都是一个int (就像*array是对第一个元素的引用一样-其中array[0]只是指针表示法中的*(array + 0) ,当然,它只是*(array)*array ,因为括号是然后没有必要)。

返回struct数组的大小。 sizeof keytab给出数组中字节的总数。 sizeof keytab[0]给出每个元素中的字节数。 因此sizeof keytab / sizeof keytab[0]是数组中元素的数量。 它与编写sizeof keytab / sizeof *keytabsizeof keytab / sizeof (struct key)

为什么? 因为sizeof keytab[0]只是sizeof (struct key) 但是,如果您根据sizeof (struct key)确定元素的数量,然后更改类型,则所有具有sizeof (struct key)代码都会出错,但是如果您使用sizeof keytab[0]尺寸设置,您的代码将继续具有正确数量的元素,因为您是根据sizeof "an element"而不是sizeof (an arbitrary type name)

对于1),代码需要假定我们正在查看struct key类型的成员数组。
对于2),代码不需要知道这一点。

出于可维护性的原因,这被认为是2)的优势。
考虑几个在项目上工作的人,一个将数组的定义更改为

struct key2 {    
    char * word;
    int count;
    int coolness;    
} keytab[] = /* ... */

并将struct key的定义与其他地方分开,与您的代码相同。 另一个负责带有size宏定义的代码部分。

然后1)变成错误,但2)保持正确。
因此1)将需要两个开发人员之间进行额外的同步,这意味着需要付出额外的努力并有出错的风险。

有人可以告诉我最后一行的含义吗?

使用struct key类型获取数组元素的实际数量

在这里谈论什么优势?

除了不明确依赖某种类型的优势外,

编译器可以使用实际定义对宏进行更多优化。 sizeof(type)相比, sizeof(var)优化效果更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM