确定C中动态数组的结束

时间:2015-02-02 03:57:18

标签: c arrays dynamic-arrays

我有一个用户定义的结构调用MyStruct并分配一个2D动态数组:

MyStruct** arr = (MyStruct**) malloc(sizeof(myStruct*)*size);

我想在函数中处理数组:

void compute(MyStruct** lst)
{
    int index = 0;
    while(lst[index] != NULL)
    {  
        //do something
        index++;
    }
}

我打电话给compute(arr),它运作正常。但是valgrind抱怨说sizeof(MyStruct)行的大小while(...)无效。据我所知,此时索引超出了1个元素。一个简单的解决方法是将size传递给函数,并通过循环检查是否index < size

出于好奇,无论如何我仍然可以遍历数组而不索引额外的元素并且不将size传递给函数?

1 个答案:

答案 0 :(得分:4)

没有标准方式,没有。

也就是说,可能有一些非标准的方法可以获得malloc内存的分配大小。例如,我的机器在<malloc/malloc.h>中有一个size_t malloc_size(const void *);功能; glibc具有malloc_usable_size函数,具有类似的签名;并且Microsoft的libc实现具有_msize功能,也具有类似的签名。

但这些不能简单地放入;除了明显的可移植性问题之外,它们还会返回为您分配的实际内存量,可能比您请求的内容略多。对于某些应用程序来说可能没问题,但也许不适合迭代你的数组。

您可能应该将大小作为第二个参数传递。我知道,无聊。