當我發現了有關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]
語法聲明變量,並且我不會在任何地方撥打malloc
,realloc
或free
,則不會再出現此問題。
如果您在支持[GNU'getline()'](https://www.gnu.org/software/libc/manual/html_node/Line-Input.html)的平臺上,您可能需要考慮使用它 - 它有助於管理輸入行的緩衝區的動態分配(儘管您仍然需要一個變量來跟蹤大小)。 – 2014-10-03 05:11:01
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