Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 什么';这是确定结构大小的最合适的方法_C_Struct_Sizeof - Fatal编程技术网

C 什么';这是确定结构大小的最合适的方法

C 什么';这是确定结构大小的最合适的方法,c,struct,sizeof,C,Struct,Sizeof,我在C中见过3种不同的方法来确定结构的大小 typedef struct A { int a, b; } A; sizeof(A); // method 1 sizeof(struct A); // method 2 A *p; sizeof(*p); // method 3 哪种方法最合适?考虑效率和可读性。< P>除使用可变长度数组外, sieOS/为100%编译时间。因此,除了在可读性、可理解性、安全性等方面的间接考虑外,没有“效率” 我喜欢重复最少,打字最少的版本。因

我在C中见过3种不同的方法来确定结构的大小

typedef struct A {
    int a, b;
} A;


sizeof(A); // method 1

sizeof(struct A); // method 2

A *p; 
sizeof(*p); // method 3

哪种方法最合适?考虑效率和可读性。

< P>除使用可变长度数组外,<代码> sieOS/<代码>为100%编译时间。因此,除了在可读性、可理解性、安全性等方面的间接考虑外,没有“效率”

我喜欢重复最少,打字最少的版本。因此,如果指针可用,我总是使用第三种形式,但没有括号,因为它们不需要

例如:

float *a = malloc(1000 * sizeof *a);
请注意,类似这样的代码将
sizeof
锁定到正在使用的指针,这至少比重复类型要好一些(我认为这要好得多,因为典型函数的作用域中的指针比它们的类型名少),因为不匹配的风险相应降低

只有当参数是类型名称时,才需要代码中的括号,如
sizeof(float)
sizeof(A)
。因为它使它看起来像一个函数调用,而事实并非如此,当我必须使用该表单时,我总是用空格格式化它:

void *p = malloc(1000 * sizeof (float));

请记住,
sizeof
不是一个函数。

除非使用可变长度数组,
sizeof
是100%编译时间。因此,除了在可读性、可理解性、安全性等方面的间接考虑外,没有“效率”

我喜欢重复最少,打字最少的版本。因此,如果指针可用,我总是使用第三种形式,但没有括号,因为它们不需要

例如:

float *a = malloc(1000 * sizeof *a);
请注意,类似这样的代码将
sizeof
锁定到正在使用的指针,这至少比重复类型要好一些(我认为这要好得多,因为典型函数的作用域中的指针比它们的类型名少),因为不匹配的风险相应降低

只有当参数是类型名称时,才需要代码中的括号,如
sizeof(float)
sizeof(A)
。因为它使它看起来像一个函数调用,而事实并非如此,当我必须使用该表单时,我总是用空格格式化它:

void *p = malloc(1000 * sizeof (float));

请记住,
sizeof
不是一个函数。

这里的typedef是毫无意义的,并且混淆了您错过了sizeof的一个重要用途这一事实。我会假装您没有使用typedef,而是询问变量的大小。例如,您有一个名为
a
的变量,类型为
struct a

就可读性而言,这完全取决于上下文(和个人偏好)。分配内存时,使用3更具可读性:

p = malloc( sizeof *p );
当试图确定结构的大小时,最好使用2(尽管这是一个非常人为的示例,因为方法2几乎从来都不可取):

如果您想知道变量的大小,请使用方法1:

void *ptr = malloc( COUNT * sizeof A );
在实践中,方法3几乎总是首选的。(这是一份个人意见声明。)


我简短地说,确定为什么要计算大小。这将推动“可读”的定义。

这里的typedef是毫无意义的,并且混淆了您错过了sizeof的一个重要用途这一事实。我会假装您没有使用typedef,而是询问变量的大小。例如,您有一个名为
a
的变量,类型为
struct a

就可读性而言,这完全取决于上下文(和个人偏好)。分配内存时,使用3更具可读性:

p = malloc( sizeof *p );
当试图确定结构的大小时,最好使用2(尽管这是一个非常人为的示例,因为方法2几乎从来都不可取):

如果您想知道变量的大小,请使用方法1:

void *ptr = malloc( COUNT * sizeof A );
在实践中,方法3几乎总是首选的。(这是一份个人意见声明。)


我简短地说,确定为什么要计算大小。这将推动“可读”的定义。

sizeof
在编译时(*)进行评估,因此它们都同样有效

剩下的问题是关于编码风格的

有两个阵营在争论是否对结构使用typedef。一个阵营(最著名的是Linux内核人员)认为
structa
typedef
更清晰。另一个阵营(除了Linux之外几乎所有人)认为
typedef
更清晰。这些都是主观意见,没有共识,没有对错。两种形式都可以

然后还有另一个关于
sizeof(type of ptr)
还是
sizeof(*ptr)
更清晰的编码风格争论。同样,没有达成共识,这是主观的编码风格

因此,您的问题的答案是:这取决于您的编码风格标准。您的编码标准为您当前的项目规定的格式



(*)除了VLAs的sizeof

sizeof
在编译时评估(*),因此它们都同样有效

剩下的问题是关于编码风格的

有两个阵营在争论是否对结构使用typedef。一个阵营(最著名的是Linux内核人员)认为
structa
typedef
更清晰。另一个阵营(除了Linux之外几乎所有人)认为
typedef
更清晰。这些都是主观意见,没有共识,没有对错。两种形式都可以

然后还有另一个关于
sizeof(type of ptr)
还是
sizeof(*ptr)
更清晰的编码风格争论。同样,没有达成共识,这是主观的编码风格

因此,您的问题的答案是:这取决于您的编码风格标准。您的编码标准为您当前的项目规定的格式


(*)除了VLAs的尺寸