gpt4 book ai didi

c - 如何计算数组的元素个数

转载 作者:太空宇宙 更新时间:2023-11-04 05:24:29 25 4
gpt4 key购买 nike

我在测试代码时遇到问题,我定义了一个获取数组元素个数的宏如下:

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

这个宏可以很好地计算初始化器与存储容量匹配的数组元素的数量(例如 int buf[] = {1,2,3};),但不是很有效数组声明为:int buf[20] = {1,2,3};

现在我知道像这样计算数组元素很容易,但是大量元素呢?你如何计算它们?数数可能是一个 killer ,你知道的!

考虑以下代码:

#include <stdio.h>
#include <string.h>

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

void g_strcat(void *_Dst, size_t dstSize, size_t bytes, const void *_Src, size_t srcSize);

int main(void)
{
int dst[20] = { 1,2,3 };
int src[] = { 4,5,6 };

size_t dstSize = 3; // dstSize = ARRAY_SIZE(dst) doesn't work
size_t srcSize = ARRAY_SIZE(src);

g_strcat(dst, dstSize, sizeof(int), src, srcSize);

size_t n, newSize = dstSize + srcSize;
for (n = 0; n < newSize; n++) {
printf("%d ", dst[n]);
}
putchar('\n');
return 0;
}

void g_strcat(void *_Dst, size_t dstSize, size_t bytes, const void *_Src, size_t srcSize)
{
memcpy((char *)_Dst + (dstSize * bytes), _Src, srcSize * bytes);
}

最佳答案

如果您仅部分初始化原始数据类型列表(即:int 数组),则其余元素将初始化为 0

C99 Standard 6.7.8.21

If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate, or fewer characters in a string literal used to initialize an array of known size than there are elements in the array, the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration.

在您的情况下,您正在尝试确定初始值设定项列表的大小。真的想不出需要这样做的正当理由,但您可以简单地检查元素何时开始始终等于零。当然,如果您故意将元素设置为零,这将失败。

您编写的宏将正常工作(即:返回数组中元素的数量),但如果您在接受数组指针作为参数的函数中使用它,它将失败,as pointer decay causes sizeof to act differently than one might expect.

综上所述,您无法确定任何有意义的初始化列表的大小,除非您这样做,将初始化列表定义为宏:


代码 list


#include <stdio.h>
#define LIST {1,2,3}

int main(void)
{
int i[20] = LIST;
int t[] = LIST;

printf("elements in i: %d\n", sizeof(i)/sizeof(int));
printf("elements in t: %d\n", sizeof(t)/sizeof(int));

return 0;
}

示例输出


elements in i: 20
elements in t: 3

您可以通过将丢弃的数组放入新的 block 作用域来最大限度地减少内存浪费,即:


#include <stdio.h>
#define LIST {1,2,3}

int main(void)
{
int i[20] = LIST;
int initListSize = 0;

{
int t[] = LIST;
initListSize = sizeof(t) / sizeof(int);
}

printf("elements in t: %d\n", initListSize);

return 0;
}

这会将临时数组的存储生命周期限制在大括号之间的狭窄范围内。同样,我认为这可能作为实验很有用,但看不到它会进入生产代码。

关于c - 如何计算数组的元素个数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37051591/

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