在c中,我们使用sizeof()
来获取数据类型的大小。所以
如何定义。它是一个宏或一个函数。
因为我们可以将其用作两种方式,
sizeof int
和
sizeof(int)
所以如何在头文件中定义它。
答案 0 :(得分:5)
它既不是。它是一个内置运算符,其值在编译时计算,除非参数是可变长度数组的名称(在C99中添加)。
您经常看到的括号不是“调用”的一部分,因为sizeof
不是函数。它们是参数的一部分,仅在参数是强制转换表达式时才需要,即括在括号中的类型的名称。
我个人建议使用带有类型名称sizeof
的 作为参数,因为它通常不需要,并且会创建断开/解耦,这可能导致错误。
考虑这样的事情:
float *vector = malloc(100 * sizeof(double));
上述内容当然包含一个错误:如果float
小于double
,则会浪费大量内存。如果vector
以double
的数组开头但后来更改为float
,则很容易想象最终会出现上述内容。为了保护这个,我总是这样写:
float *vector = malloc(10 * sizeof *vector);
以上使用参数*vector
(float
类型的表达式)到sizeof
,不类型名称,因此不需要括号。它还将元素的大小“锁定”到用于保存元素的指针,这样更安全。
答案 1 :(得分:4)
Sizeof既不是宏也不是函数。它是在编译时计算的运算符。
在预处理阶段评估的宏。
正如@Yu Hao所指出的,可变长度数组是唯一的例外。
For More Understanding解决这个问题;
#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
答案 2 :(得分:2)
来自ISO / IEC9899
6.5.3.4 sizeof运算符
约束
1 sizeof运算符不应用于具有函数类型的表达式 不完整的类型,这种类型的括号名称,或表达式 指定一个位字段成员。
所以它既不是宏也不是函数。它是一个运算符!
以及它的处理方式是编译器。
但是关于编译时间和运行时确定,标准说:
语义
2 sizeof运算符产生其操作数的大小(以字节为单位),可以是一个 表达式或类型的括号名称。大小由类型确定 操作数。结果是整数。如果操作数的类型是可变长度数组 type,操作数被评估;否则,不评估操作数,结果是 整数常数。
因此,除了VLA案例之外,它甚至可以在编译时确定。
答案 3 :(得分:0)
<强>语法强>
两个版本都返回std :: size_t类型的常量。
<强>解释强>
答案 4 :(得分:0)
一元运算符 sizeof 用于计算任何数据类型的大小,以表示该类型所需的字节数来衡量。
在许多程序中,有些情况下知道特定数据类型的大小是有用的(最常见的例子之一是使用库函数malloc的动态内存分配)。虽然对于C或C ++的任何给定实现,特定数据类型的大小是常量,但C和C ++中的偶数基本类型的大小是实现定义的(即,标准没有精确定义)。尝试分配适当大小的内存块时,这可能会导致问题。例如,假设程序员想要分配一个足够大的内存块来容纳十个int类型的变量。因为我们的假设程序员不知道int类型的确切大小,程序员不知道要求malloc的字节数。因此,有必要使用sizeof: