我有一个用户定义的结构调用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
传递给函数?
答案 0 :(得分:4)
没有标准方式,没有。
也就是说,可能有一些非标准的方法可以获得malloc
内存的分配大小。例如,我的机器在<malloc/malloc.h>
中有一个size_t malloc_size(const void *);
功能; glibc具有malloc_usable_size
函数,具有类似的签名;并且Microsoft的libc实现具有_msize
功能,也具有类似的签名。
但这些不能简单地放入;除了明显的可移植性问题之外,它们还会返回为您分配的实际内存量,可能比您请求的内容略多。对于某些应用程序来说可能没问题,但也许不适合迭代你的数组。
您可能应该将大小作为第二个参数传递。我知道,无聊。