我有一个用于计算C代码中数组大小的宏:
#define sizearray(a) (sizeof(a) / sizeof((a)[0]))
当我测试它时,它适用于静态定义的数组,但对于动态定义的数组则不行(见下文)。我不确定我理解为什么会这样。有没有办法计算堆上分配的数组的大小?
/* test sizearray macro */
void testSIZEARRAY(void)
{
/* test case for statically defined array */
int a[5] = {0,0,0,0,0};
assert(sizearray(a) == 5);
/* test case for dynamically defined array */
int *b;
b = calloc(5, sizeof(int));
assert(sizearray(b) == 5);
free(b);
}
答案 0 :(得分:5)
答案是否定的,没有标准的方法来获得动态分配的数组的大小。
出于所有实际目的,你必须自己跟踪它。
但是,有一些特定于编译器的方法可以做到这一点:
Windows(Visual Studio): _msize()
GCC: msize()在GCC文档中找不到...
答案 1 :(得分:4)
int *b;
...
assert(sizearray(b) == 5);
指针不是数组。 b
被声明为指向int
下面
sizeof b == sizeof (int *)
应用于指针类型对象的sizeof
运算符与指针类型的大小相同,并且不等于已分配数组的大小。
要知道已分配的数组对象的大小,您必须检查分配的内容。在您的示例中,您分配了一个5 int
的对象,因此数组的大小为:
5 * sizeof (int)
(或等效,5 * sizeof *b
)
答案 2 :(得分:3)
如果只有一个指向其第一个元素的指针,则无法计算数组的大小(就像上面使用int * b一样)。您需要单独存储数组大小并将其与指针一起使用,或者以某种方式标记数组的末尾。后一种解决方案用于字符数组,通常以空值终止(将\ 0作为最后一个字符)。在这种情况下,您可以通过循环计算大小,直到遇到这样的终止字符。
答案 3 :(得分:1)
以下是不好的建议,不要这样做。
要获取当前glibc
的{{1}}(等)分配的内存,您可以尝试以下操作:
malloc()
除了确实可以获得分配的内存量之外,使用此代码付款时有趣的事情是,在大多数情况下,所请求的内存大小超过了
无论如何,后者使得尝试从原始请求的确切大小中提取信息变得不安全。