用realloc()函数创建函数

时间:2013-10-01 15:06:56

标签: c arrays function realloc

我想创建一个重新分配typedef struct

的2D数组的函数
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 typenumint typetotal和将通过realloc()初始化的2D数组。

当我尝试编译时,我在Tiny C(Windows)中收到错误:*文件在C中。

  1. 错误:无法转换&#39; struct参数&#39;到&#39; void *&#39;

    (这是&#39; p [i] = realloc(p [i],sizeof(参数)* typetotal&#39;)

  2. 任何人都可以帮我重写这个功能,以便能够在Parameter *p内重新分配2D数组吗?


    我尝试将void reallocation(Parameters *p, ...)更改为void reallocation(Parameters *p[], ...),错误#2与错误#1相同,并显示在=的{​​{1}}

2 个答案:

答案 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