正如我在上方写的那样,我正在尝试编写一个分配数据结构的函数
这是我所做的,但是当我试图用索引调用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
}
它引发错误
订阅值既不是数组,也不是指针,也不是向量
使用vlas。
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;
}
当您通过零时,它将分配新内存,如果没有,它将重新分配内存
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.
}
到目前为止,您也正在使用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;
}
做
void initDyn(dyntab *dtab, int size){ dtab=malloc(size*sizeof(dyntab)); }
您仅分配本地var dtab 以 malloc 的结果分配, initdyn
malloc请注意,最好不要在 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 的元素数?