【发布时间】:2016-08-31 07:12:02
【问题描述】:
我在测试代码时遇到问题。我定义了一个宏来获取数组的元素个数,如下所示:
#define ARRAY_SIZE(arr) sizeof(arr) / sizeof(arr[0])
这个宏适用于计算初始化器与存储容量匹配的数组元素的数量(例如int buf[] = {1,2,3};),但对于声明为int buf[20] = {1,2,3};的数组不是很有效
现在我知道像这样计算数组元素非常容易,但是大量元素呢?你怎么数他们?计数可能是一个杀手,你知道的!
考虑以下代码:
#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);
}
【问题讨论】:
-
你的意思是计算初始化列表的大小而不是数组的大小?
-
是的,我就是这个意思
-
buf[20] = {1,2,3,0}的计数是多少? -
这听起来很像XY problem。 为什么您需要知道有多少数组已被显式初始化?
-
@AndrewHenle 差不多。我只是回答它,因为有一个可行的解决方案,但问题本身在现实世界的场景中似乎毫无用处。真的很好奇为什么 OP 需要做到这一点。