我通过类似的函数传递结构...
expandArrayofStructs(Container *container, int n)
这个容器是一个结构,在该结构内部是另一种结构的数组,我称之为内部结构。
我想将内部数组的大小扩展一些值,然后在扩展数组后继续使用我的原始函数。因此,这个扩展函数不返回任何内容,而只是调用它并扩展数据并完成,程序继续使用比以前更大的新数组。
我对情况的理解是这样的,但这不能正常工作......
int expandArrayofStructs(Container *container, int n)
{
container->inner = realloc(container->inner, sizeof(inner) * 50);
^
Just a number i picked. so if i
already had an array of 50
I would be increasing by 50 here.
if(Container->inner == NULL)
//HANDLE ERROR IF REALLOC FAILS
//Update the container length
container->length = container->length + 50;
//For some reason the specs of the program say I need to return
//the array length which is an attribute of container
return container->length;
}
但是当我以这种方式重新分配时,我甚至没有得到段错误: realloc():无效的下一个大小0x463829
最后的数字各不相同。
不确定我做错了什么,但如果有更好的方法动态重新分配结构数组,那么我愿意接受建议。这个特殊的代码不一定是它的本质。
唯一的规定是此函数返回int类型,即=新数组长度
答案 0 :(得分:2)
发生此错误是因为您没有“重新分配”更多内存。您分配的大小相同。
要修复它,只需分配您需要的总大小:
container->inner = realloc(container->inner, sizeof(inner) * (50 + container->length);
答案 1 :(得分:0)
新分配的大小应该基于数组元素的大小,而不是基于指向数组开头的指针的大小。您还想要相对于当前长度调整它的大小:
container->inner = realloc(container->inner, sizeof(*container->inner) * (container->length + 50));
答案 2 :(得分:0)
假设您的结构定义如下所示:
typedef struct { ... } Inner;
typedef struct { ...; Inner *inner; size_t length; } Container;
然后你的功能看起来像
size_t expandArrayOfStruct( Container *container, size_t extent )
{
Inner *tmp = realloc( container->inner,
sizeof *container->inner * (container->length + extent) );
if ( tmp )
{
container->length += extent;
container->inner = tmp;
}
return container->length;
}
您想将realloc
的结果分配给临时变量;如果操作失败,realloc
将返回NULL,如果将其分配给原始指针,您将丢失对已分配的内存的引用,从而导致内存泄漏。
您也可以将此功能用于原始分配:
int main( void )
{
Container c = {..., NULL, 0 };
size_t len = expandArrayOfStruct( &c, 50 );
if ( len != 50 )
{
// allocation failed
}
...
}
答案 3 :(得分:0)
你必须分配新的记忆,而你不能这样做。
int expandArrayofStructs(Container *container, int n)
{
container->inner = realloc(container->inner, sizeof(inner) * (50 + container->length));
if(Container->inner == NULL)
/* return -1; (set realloc handle errors properly)*/
container->length = container->length + 50;
return container->length;
}
答案 4 :(得分:0)
为什么不阅读手册页(参见http://linux.die.net/man/3/realloc)。您每次使用相同的尺寸。此外 - 为什么不使用链表?