c - sizeof-函数还是宏?

标签 c sizeof

<分区>

在 c 中,我们使用 sizeof() 来获取数据类型的大小。所以 它是如何定义的。它是一个宏或一个函数。

因为我们可以用两种方式,

sizeof int

sizeof(int)

那么这是如何在头文件中定义的。

最佳答案

两者都不是。它是一个内置运算符,其值是在编译时计算的,除非参数是可变长度数组的名称(在 C99 中添加)。

您经常看到的括号不是“调用”的一部分,因为sizeof 不是函数。它们是参数的一部分,并且只有当参数是强制转换表达式时才需要,即括在圆括号中的类型的名称。

我个人建议反对尽可能使用带有类型名称的sizeof作为参数,因为它通常不需要,并且会创建一个断开连接/解耦,这可能会导致错误。

考虑这样的事情:

float *vector = malloc(100 * sizeof(double));

当然,上面有一个bug:如果float小于double,会浪费很多内存。如果 vector 最初是 double 的数组但后来更改为 float,很容易想象得到类似上面的结果。为了防止这种情况,我总是这样写:

float *vector = malloc(10 * sizeof *vector);

上面使用参数*vector(float 类型的表达式)到sizeof不是 类型名称,因此不需要括号。它还将元素的大小“锁定”到用于保存它的指针,这样更安全。

关于c - sizeof-函数还是宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28363064/

相关文章:

c - 如何将 char 指针值分配给整数/char 变量或数组

c - C中二叉树的删除函数

c - 为什么这个 C sizeof 函数在不同的上下文中显示不同的值?

c++ - sizeof(T) == sizeof(int) 吗?

c++ - unsigned long long是否固定为一个int(4字节)范围,如果是,为什么它在内存中是8字节?

c - 添加偏移量时数组名称上的 sizeof 运算符

c - 二维数组的大小

c++ - 在所有操作系统中应用文件统计(统计的结构类型)

c,如何检测另一个进程是否正在写入文件

c - 绑定(bind)失败 : : Address family not supported by protocol family - C