2014-01-05 93 views
0

你好我在大学的一次练习中需要用这种方法给malloc一个数组。星星阵列有1个插槽。如果输入不止一个,那么数组会翻倍。如果输入超过2,那么它会再次翻倍等等。之后,我必须裁剪阵列以适合输入的数量。例如,如果我有5个输入,那么阵列将有8个插槽,我必须让它有5个插槽,我不知道如何。这是我到目前为止的代码:Malloc Realloc免费

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; 

} 
+1

不要施放'malloc's。 – arshajii

+0

不要在'%s“中使用'scanf''!改为使用'fgets'或POSIX'getline'。出于好奇:你有没有被教过在你的大学里使用'scanf'这样的? – mafso

+0

@mafso是啊...我们认为它等于fgets或getline – JmRag

回答

4

您只能freemalloc/calloc/realloc结果。你不能释放单个元素。所以最后你可以简单地将realloc再次调整到所需的最终尺寸。

+0

我认为realloc只带来额外的空间。我不知道它可以删除空间。谢谢 ! – JmRag

+0

@Mario:尽可能多的“删除空间”是有道理的:-) –

1

你有一对夫妇的其他问题:
1)当你输入字符串分配空间,您需要添加1以保留尾随您的realloc之前“\ 0”
2),你应该有一个switch语句,它将使用array_size并使用它来确定新的大小。如果我理解你的问题,你想从1→2→4→n(其中n是下一个数字)。你的realloc代码每次只增加一倍。你需要改变它。
3)当您释放条目时,您需要小心,因为您似乎没有释放类/结构的“名称”成员。
4)释放循环中的成员后,然后在名称类/结构体上自由地执行一个操作。

我可以稍后仔细研究它。