2014-01-05 130 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)釋放循環中的成員後,然後在名稱類/結構體上自由地執行一個操作。

我可以稍後仔細研究它。