用C计算数组大小

时间:2012-01-05 22:24:57

标签: c arrays

我有一个用于计算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);
}

4 个答案:

答案 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()

除了确实可以获得分配的内存量之外,使用此代码付款时有趣的事情是,在大多数情况下,所请求的内存大小超过了

无论如何,后者使得尝试从原始请求的确切大小中提取信息变得不安全。