2014-02-26 92 views
0
FILE *fp; 
char *in; 
char *sa[20]; 
char inn[100]; 

//other stuff here 

for(huge loop) { 
    fp = popen(filename, "r"); 
    fscanf(fp, "%100s", inn); 
    in = strtok(inn, "="); 
    i = 0; 
    while(in != NULL) { 
     sa[i++] = in; 
     in = strtok (NULL, "="); 
    } 
} 

這在我的linux機器上編譯並運行了大約4分鐘,因爲它會對大量數據文件進行排序,然後進行分段錯誤。它直到這一點都正確運行,並且這一點取決於我做了多少事情,所以我強烈懷疑有內存泄漏,我應該釋放指針。但我認爲沒有malloc編譯器會自動分配並取消分配指針內存。我究竟做錯了什麼?指針,內存不足,分段錯誤?

謝謝。

+2

你在哪裏做'pclose'? –

+1

另外,你知道'strtok'不會返回唯一的指針,並且它返回指向它標記的字符串的指針?這意味着'sa'中的所有*指針將指向'inn'中的不同位置。如果'inn'是一個局部變量而'sa'不是,那麼你在你之前就有麻煩了。 –

+0

不檢查'popen()'的返回值是邪惡的。 – Asblarf

回答

2

您將不會在inn陣列中留出空終止符。

對於每個popen沒有pclose

您不檢查返回值popen。我們不保證您不會溢出sa數組。

+0

就是這樣。它現在運行完成。謝謝!我想我應該不那麼懶惰,並檢查客棧和popen的價值。一個數組類型不能用我的數據類型溢出(理論上)。 –

+0

@MatthewClarkson外部來源的數據永遠不應該被信任,尤其是當這種信任可能導致崩潰時。爲什麼要避免一個簡單的'if'測試?您的程序無疑是I/O限制的,因此它對性能的影響爲0%。毫無疑問,「popen」可以並且會失敗。不檢查它是堅果。 –