你好我在大学练习我需要用这种方式malloc一个数组。星星阵列有1个插槽。如果输入多于一个,则数组加倍。如果输入超过2,则再次加倍等。之后我必须裁剪数组以适应输入的数量。例如,如果我有5个输入,那么阵列将有8个插槽,我必须使它有5个插槽,我无法弄清楚如何。到目前为止,这是我的代码:
nameInfoT* ReadNames(int* size){
nameInfoT* names ;
int array_size=1;
int entries=0;
char input[length];
names=(nameInfoT*) malloc(sizeof(nameInfoT)*array_size);
do{
scanf("%s",input);
if(!strcmp(input,"END")) break;
if(entries==array_size){
array_size=array_size*2;
names= (nameInfoT*) realloc(names,sizeof(nameInfoT)*array_size);
}
names[entries].name=(char*)malloc(sizeof(char)*strlen(input));
strcpy(names[entries].name,input);
entries++;
}while(1);
printf("there are %d free spaces \n",array_size-entries);
*size=entries;
printf("there are %d entries \n",*size);
int i;
for(i=array_size;i>entries;i--){
free(names[i]);//here it won't compile
}
return names;
}
答案 0 :(得分:4)
您free
/ malloc
/ calloc
的结果只能realloc
。你不能释放个人元素。因此,最后您可以再次realloc
再次达到所需的最终尺寸。
答案 1 :(得分:1)
你还有其他一些问题:
1)当你为输入字符串分配空间时,你需要加1以保持尾随'\ 0'
2)在你的realloc之前,你应该有一个switch语句,它将获取array_size并使用它来确定新的大小。如果我理解你的问题,你想从1 - > 2 - > 4 - > n(其中n是下一个数字)。你的realloc代码每次只增加一倍。你需要改变它。
3)当你释放条目时,你需要小心,因为你似乎没有释放类/结构的'name'成员。
4)在释放循环中的成员之后,在名称类/结构上执行一次释放。
我可以稍后仔细研究一下。