对具有动态数组的结构指针使用内存分配(realloc)时出错
vector_int.h是一个具有自制动态数组(vector)结构的头文件 c是一个测试程序 所有代码如下: 向量_int.h: 我认为使用realloc函数有错误,但我认为我做得很好。对具有动态数组的结构指针使用内存分配(realloc)时出错,c,function,memory-management,std,C,Function,Memory Management,Std,vector_int.h是一个具有自制动态数组(vector)结构的头文件 c是一个测试程序 所有代码如下: 向量_int.h: 我认为使用realloc函数有错误,但我认为我做得很好。 请帮助我找出一个或多个错误。您有一些问题: 隐式声明/realloc问题是因为需要为realloc签名包含stdlib.h。如果没有函数签名,编译器将对函数参数和返回值进行一些假设,然后在链接过程中,如果这些假设与实际函数实现不匹配,链接器会对此进行投诉 您正在传递realloc一个尚未初始化的地址。这是自
请帮助我找出一个或多个错误。您有一些问题:
问题是因为需要为隐式声明/realloc
签名包含realloc
。如果没有函数签名,编译器将对函数参数和返回值进行一些假设,然后在链接过程中,如果这些假设与实际函数实现不匹配,链接器会对此进行投诉stdlib.h
- 您正在传递
一个尚未初始化的地址。这是自找麻烦。在使用realloc
变量之前,请执行一些初始化操作:向量
vector->array = NULL; vector->len = 0;
- 此外,您使用的
是不正确的:它不会改变您给它的实际指针,只会改变指向它的内存块的大小。您需要自己重新分配指针。请注意,realloc
在失败时可以返回realloc
,因此请执行以下操作:NULL
tmp = realloc(vector->array, size * sizeof(int)); if (tmp != NULL) { vector->array = tmp; vector->len = size; // Changing of length variable } else handleAllocError();
- 最后,不要在标题中定义函数。这将起作用,但最好有一个实现文件
,该文件定义了头文件中声明的函数vector_int.c
- 您需要一个
+1
在这里:
ResizeVectorInt(&vector, cell_number + 1); // Grow size of memory if it's not enough
另外,
vector
从未初始化,因此对realloc的第一次调用是未定义的。非常感谢!现在程序正在编译,但没有handleAllocError()。[Linker error]C:\Users\ALEXAN~1\AppData\Local\Temp\ccGPxG6V.o:test.C:(.text+0x57):未定义对“handleAllocError”的引用考虑handleAllocError
伪代码:如果realloc
失败,您需要自行决定该怎么做。它可以像printf
/log
一样简单。因此,删除handleAllocError
并添加您自己的代码来处理realloc
故障。
vector->array = NULL;
vector->len = 0;
tmp = realloc(vector->array, size * sizeof(int));
if (tmp != NULL)
{
vector->array = tmp;
vector->len = size; // Changing of length variable
}
else handleAllocError();
ResizeVectorInt(&vector, cell_number + 1); // Grow size of memory if it's not enough