在c中,我们使用sizeof()获取数据类型的大小。所以它是如何定义的。它是一个宏或一个函数。
因为我们可以用这两种方式,
sizeof int和
sizeof(int)那么这是如何在头文件中定义的。
发布于 2015-02-06 10:22:32
两者都不是。它是一个内置操作符,其值是在编译时计算的,除非参数是变量长度数组的名称(添加在C99中)。
您经常看到的括号不是“调用”的一部分,因为sizeof不是一个函数。它们是参数的一部分,只有当参数是一个强制表达式时才需要,即括在括号中的类型的名称。
我个人建议在可能的情况下不要使用带有类型名称的sizeof作为参数,因为它通常不需要,并且会创建一个断开/解耦合,从而导致错误。
考虑一下这样的事情:
float *vector = malloc(100 * sizeof(double));当然,上面的代码包含一个bug:如果float小于double,那么它将浪费大量内存。如果vector最初是一个double数组,但后来被更改为float,那么很容易想象会出现类似上述情况的结果。为了保护这一点,我总是写道:
float *vector = malloc(10 * sizeof *vector);上面的参数*vector (float类型的表达式)用于sizeof,它不是类型名称,因此不需要括号。它还将元素的大小“锁定”到用来保存它的指针,这样更安全。
发布于 2015-02-06 10:01:14
Sizeof既不是宏,也不是function.Its,它是在编译时计算的操作符。
宏在pr处理阶段进行评估。
正如余浩指出的那样,可变长度数组是唯一的例外。
为了更多的理解,解决这一问题;
#include<stdio.h>
char func(char x)
{
x++;
return x;
}
int main()
{
printf("%zu", sizeof(func(3)));
return 0;
}
A) 1 B)2 C)3 D)4发布于 2015-02-06 10:04:21
调自ISO/ISO 9899
6.5.3.4规模较大的经营者 约束条件 1不应对具有函数类型或不完全类型的表达式、此类类型的括号大小名称或指定位字段成员的表达式应用sizeof of运算符。
因此,它既不是宏,也不是function.Its,不是运算符!
它的处理方式是编译器的一部分。
但是关于编译时间和运行时确定,标准说:
语义学 2大号运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或类型的括号大小名称。大小由操作数的类型确定。结果是一个整数。如果操作数的类型是可变长度数组类型,则计算操作数;否则,将不计算操作数,结果是整数常量。
因此,除了VLA的情况外,还可以根据编译时间来确定它的标准。
https://stackoverflow.com/questions/28363064
复制相似问题