2011-08-18 26 views
-3

下列哪一個是最好期運用realloc()的多次

file=fopen(argv[1],"r"); 
arr=(unsigned int *)malloc(4); 

while(!feof(file)) 
{ 
    ++arr_size; 
    arr=(unsigned int *)realloc(arr,arr_size*sizeof(unsigned int) 
    fscanf(file,"%u\n",&arr[arr_size-1]); 
} 
fclose(file); 

或本

arr=(unsigned int *)malloc(some_size*sizeof(unsigned int)); 
file=fopen(argv[1],"r"); 
arr=(unsigned int *)malloc(4); 

while(!feof(file)) 
{ 
    ++arr_size; 
    fscanf(file,"%u\n",&arr[arr_size-1]); 
} 
fclose(file); 
+3

第二個有內存泄漏?你重新分配malloced空間而不釋放它,甚至不使用第一行? –

+0

使用'realloc'時,您還必須小心,如果出現錯誤並且它返回null,則會按照寫入方式丟失原始指針。 –

+1

假設輸入文件長度超過4個字節,第二個緩衝區溢出。 –

回答

1

爲什麼沒有第三條道路 - 工作了,當你打開你多少內存要求文件?

+0

如何做到這一點。文本文件不包含文件聽衆。因此我應該從頭到尾閱讀文件。並再次閱讀整數。所以我應該讀兩次文件? –

+0

@R Krishna Sagar:您可以通過Posix上的'fstat',Windows上的'GetFileSizeEx'或者更便攜的'fseek'到文件尾部然後'ftell'找到您當前的偏移量來獲取文件大小,這是文件大小。因爲便攜式('ftell')只使用'long',所以一定要檢查用於您使用的API的大小的整數類型,如果有可能會遇到大文件(> 2GB)。 –

+0

'ftell'是首選的方法; 'fstat'可能無法給出某些特殊文件和設備的答案。實際上,當你有POSIX功能時,'ftello'會更好,但如果文件大於'long',那麼幾乎肯定不會適應內存。 –