2014-10-03 244 views
2

當我發現了有關malloc方法和類似的內存管理方法時,我一直試圖在C編程中使用「內存感知」。但是,當我嘗試使用realloc爲我的程序中的char*實例分配儘可能少的內存時,我發現它並沒有像我想象的那樣保存儘可能多的數據。malloc和free:被釋放的指針沒有被分配

這裏是我的代碼:

int foo(char * arg){ 
    if(condition){ 
     //code here 
    }else if(other_condition){ 
     char * cmd = malloc(5); 
     fgets(cmd,sizeof(cmd),stdin); 
     //more code here 
     if(another_condition){ 
      //more code 
      cmd = realloc(cmd,new_size) //once in this if block, but also once in another block 
      fgets(cmd,sizeof(cmd),stdin); 
      //more code 
     } 
     //more else-if blocks here 
     free(cmd) 
    } 
    //more else-if blocks here 
} 

具體而言,在上面的代碼片段,new_size爲255,雖然它已經被設置爲在其他地方其他尺寸。問題是,當我運行程序時,我只能得到7個字母的輸入。

輸出示例:

... 
Enter filename: document1 
Loading file "documen" 
Load failed 
... 
(here the next time fgets is called it fails because "t1" is not valid input for the program) 

我的理解,它的接收"t1"因爲我不清除輸入緩衝區,但我想解決的是,我只接收的前7個字符的事實輸入。如果我在中間調用sizeof(cmd),它告訴我cmd佔用的內存是8.我也嘗試使用char * cmd = malloc(5 * sizeof(char))cmd = realloc(cmd,255 * sizeof(char))分配內存,但它沒有解決問題。我應該提到,如果我使用char cmd[255]語法聲明變量,並且我不會在任何地方撥打mallocreallocfree,則不會再出現此問題。

+0

如果您在支持[GNU'getline()'](https://www.gnu.org/software/libc/manual/html_node/Line-Input.html)的平臺上,您可能需要考慮使用它 - 它有助於管理輸入行的緩衝區的動態分配(儘管您仍然需要一個變量來跟蹤大小)。 – 2014-10-03 05:11:01

+1

http://stackoverflow.com/questions/2478240/how-i-return-the-size-of-the-pointer-that-i-have-allocate-with-malloc – 2014-10-03 05:11:30

回答

2
fgets(cmd,sizeof(cmd),stdin); 

這裏cmdchar*而不是char[]。因此,其大小始終是指針的大小,而不是數組大小。

您應該跟蹤自己分配的塊大小。

+0

有沒有辦法使用'malloc'用'char []'?如果我用'char cmd [] = malloc(255)'聲明變量,它說「數組初始值設定項必須是初始化列表或字符串文字」。還有其他解決方案嗎?釋放'cmd'的內存以等待它超出範圍的唯一方法是? – Arc676 2014-10-03 04:43:41

+0

否。一般的經驗法則是,您應該明確知道(並且通常保留一個變量或一個字段)'malloc'數據的大小。你可能會考慮在[這個答案](http://stackoverflow.com/a/23433573/841108) – 2014-10-03 04:49:28

+0

@ Arc676中使用靈活的數組成員[char cmd [255];'而不是'char cmd [] = malloc(255 );' – 2014-10-03 04:57:12

相關問題