如何编写分配完整数据结构的函数

时间:2019-05-12 08:46:31

标签: c malloc

如上所述,我正在尝试编写一个分配数据结构的函数

这是我所做的,但是当我尝试使用索引调用T时会抛出错误

typedef struct {
    float *tab;
    int nbCases;
}dyntab;

void initDyn(dyntab *dtab, int size){
    dtab=malloc(size*sizeof(dyntab));
}

int main(){
    dyntab T;
    initDyn(&T, 10); // for example allocating a table with 10 cases
}

它引发错误

下标值既不是数组也不是指针也不是向量

3 个答案:

答案 0 :(得分:2)

使用VLA。

typedef struct {
    size_t nbCases;
    float tab[];
}dyntab;

dyntab *allocdyntab(dyntab *d, size_t size)
{
    dyntab *temp = realloc(d, size * sizeof(d -> tab[0]) + sizeof(*d));

    if(temp) 
    {
        temp -> nbCases = size;
    }
    return temp;
}

当您传递NULL时,它将分配新的内存,否则,将重新分配内存

int main(){
    dyntab *T = NULL;
    T = allocdyntab(T, 10); // for example allocating a table with 10 cases
    /*or*/
    //dyntab *T = allocdyntab(NULL, 10);

    /* another code */

    T = allocdyntab(T, 50); // change the size of already alllocated one without loosing the content 
    //you should add the temp variable and check the allocation result.

}

答案 1 :(得分:1)

void initDyn(dyntab *dtab, int size){
    dtab=malloc(size*sizeof(dyntab));
}

您只给本地变量 dtab 分配了 malloc 的结果, initDyn

无效

请注意,最好不要在 initDyn 中起作用,因为在调用方, T 是局部变量,而不是指针

如果要检索数组,可以使用返回值:

dyntab * initDyn(int size){
    return malloc(size*sizeof(dyntab));
}

int main(){
    dyntab * T = initDyn(10); // for example allocating a table with 10 cases
}

或使用输出变量:

void initDyn(dyntab **dtab, int size){
    *dtab=malloc(size*sizeof(dyntab));
}

int main(){
    dyntab * T;
    initDyn(&T, 10); // for example allocating a table with 10 cases
}

也许您还想为 nbCases 设置元素数量?

答案 2 :(得分:1)

到目前为止,您正在使用dyntab分配内存,以用于具有泄漏的局部变量。

void initDyn(dyntab *dtab, int size){
    dtab=malloc(size*sizeof(dyntab));
}

也许你想要

void initDyn(dyntab *dtab, int size){
    dtab->tab=malloc(size*sizeof(float));
    dtab->nbCases = size;
}