gpt4 book ai didi

c - 需要以有效方式确定 C 中数组大小的建议

转载 作者:行者123 更新时间:2023-12-01 12:37:49 30 4
gpt4 key购买 nike

在 java 中,java 脚本和其他语言有 array.length 函数可用于了解循环和其他需要的数组长度。在 C 编程中,我正在使用

sizeof()    

通过以下过程确定数组大小或数组长度的运算符:

  int array [] ={12, 3, 4, 6};

for (int i = 0; i < (sizeof(array)/sizeof(int)); i++) {
// do sometings
}

我想知道的是

  sizeof(array)/sizeof(int)

查找数组大小是否有效?或者如果有其他有效的方法,请建议我。

最佳答案

它非常高效,因为它是一个产生编译时常量的构造(C99 VLA 除外,见下文)。你可能想使用:

sizeof(array)/sizeof(array[0])

相反,因此您可以将它与非整数类型一起使用。也许将它包装在一个宏中(当然,所有关于使用宏时要小心的常见警告都适用)。

关于更新:对于我上面的原始答案,我没有考虑 C99 中的 VLA,其中:

If the type of the operand is a variable length array type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an integer constant. (6.5.3.4/2)

VLA 数组元素的计数可能只能在运行时确定(评估本身可能有副作用),因此对于 VLA 而言,它不是纯粹的编译时构造。在大多数格式良好的情况下,VLA 的代码级行为实际上是相同的。例如:

#include <stdio.h>

#define countof_array(arr) (sizeof(arr)/sizeof(arr[0]))

int vlaSize(void)
{
return 8;
}

int main(void)
{
int fixed_array[9] = { 1,2,3,4,5,6,7,8,9 };
int vla_array[vlaSize()];

printf("Fixed array: size = %zu bytes, count = %zu elements\n",
sizeof(fixed_array), countof_array(fixed_array));
printf("VLA array: size = %zu bytes, count = %zu elements\n",
sizeof(vla_array), countof_array(vla_array));

return 0;
}

结果:

$ gcc -Wall -std=c99 so-misc.c
$ ./a.out
Fixed array: size = 36 bytes, count = 9 elements
VLA array: size = 32 bytes, count = 8 elements

在进一步编辑时,删除这部分:

Caveat: It would not be difficult to intentionally create a case where the semantics of countof_array would effectively differ for a VLA [...]

因为想多了,也不确定这是不是真的。在 separate question 中询问此事.

无论如何,它仍然非常高效,因为要创建 VLA,编译器首先必须计算出 VLA 将占用多少空间。因此,即使不是 VLA 的编译时常量,它仍然是确定数组大小的最有效方法。

关于c - 需要以有效方式确定 C 中数组大小的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28038156/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com