我想创建一个重新分配typedef struct
typedef struct hero_data{
char name[254];
char title[254];
int encoding;
int startstr;
double incstr;
int startdex;
double incdex;
int startintel;
double incintel;
int basemindmg,basemaxdmg;
double bat;
double basearmor;
struct hero_data *next;
struct hero_data *Class;
}hero;
typedef struct parameters{
int toughtotal;
int nimbletotal;
int smarttotal;
int skeptictotal;
int mystictotal;
int cursedtotal;
int brutetotal;
int shreddertotal;
int vanillatotal;
int typetotal;
int typenum;
hero **smart[];
hero **nimble[];
hero **tough[];
hero **type[][];
hero **skeptic[][];
hero **mystic[][];
hero **cursed[][];
hero **brute[][];
hero **shredder[][];
hero **vanilla[][];
}Parameters;
void reallocation(Parameters *p, int typenum,int typetotal)
{
int i;
p = realloc(p,sizeof(Parameters *) * typenum);
for ( i = 0; i < typenum; i++)
{
p[i] = realloc(p[i],sizeof(Parameters) * typetotal);
}
}
上述函数应调用如:void reallocation(p->type,p->typenum,p->typetotal);
因此,通过正确替换函数的参数,我希望函数看起来像:
void reallocation(Parameters *p, int typenum,int typetotal)
{
int i;
p->type = realloc(p->type,sizeof(Parameters *) * p->typenum);
for ( i = 0; i < p->typenum; i++)
{
p->type[i] = realloc(p->type[i],sizeof(Parameters) * p->typetotal);
}
}
名为Parameters
的typedef结构包含int typenum
,int typetotal
和将通过realloc()
初始化的2D数组。
当我尝试编译时,我在Tiny C(Windows)中收到错误:*文件在C中。
错误:无法转换&#39; struct参数&#39;到&#39; void *&#39;
(这是&#39; p [i] = realloc(p [i],sizeof(参数)* typetotal&#39;)
任何人都可以帮我重写这个功能,以便能够在Parameter *p
内重新分配2D数组吗?
我尝试将void reallocation(Parameters *p, ...)
更改为void reallocation(Parameters *p[], ...)
,错误#2与错误#1相同,并显示在=
的{{1}}
答案 0 :(得分:1)
OP在C中编码,但使用的是C ++编译器。
C ++中的代码
// C
// p = realloc(p,sizeof(Parameters *) * typenum);
// C++
p = (Parameters *) realloc(p,sizeof(Parameters *) * typenum);
或强>
VS2012:设置每个C文件的属性以使用C编译器
How to compile C in visual studio 2010?
当缩小指针数组表时,OP代码存在内存泄漏。需要首先释放表中即将因realloc()
而丢失的指针。
for (i=old_typenum; i<typenum; i++) free(p[i]);
p = realloc(p,sizeof(Parameters *) * typenum);
答案 1 :(得分:1)
您的代码存在的一个大问题是您正在为彼此分配不等的类型,而您也没有检查realloc
的结果。如果此调用失败,您将泄漏最初分配的内存。
假设您的结构看起来像
typedef struct {
int typenum;
int typetotal;
} Parameters;
Parameters *p;
p = malloc(10 * sizeof(*p));
if (p == NULL)
printf("Allocatation of memory failed!\n");
要正确地重新分配到20,你可以做这样的事情
reallocate_p(&p, 20);
将功能定义为
void reallocate_p(Parameters **p, int new_size)
{
Parameters *temp;
temp = realloc(*p, sizeof(*temp) * new_size);
if (temp==NULL) {
printf("Reallocatation of memory failed!\n");
// Handle error
}
*p = temp;
return;
}
另请注意,我们不会转换malloc()
和realloc()
的返回值。
至于原因,请参阅此reference