如上所述,我正在尝试编写一个分配数据结构的函数
这是我所做的,但是当我尝试使用索引调用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
}
它引发错误
下标值既不是数组也不是指针也不是向量
答案 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;
}