2015-12-02 22 views
1

在我的程序中,我將一個保存配置文件位置的字符數組取出來,它應該是這樣的: 「/home/user/.config」當我知道字符數組的最大尺寸時使用malloc

現在我明白最長的用戶名可以是32字節長(GNU Linux),所以我知道該數組不會超過46個字符,在這種情況下,我應該使用malloc或不。

我應該使用:

char config_file_location[46]; 
strcpy (config_file_location, getenv("HOME")); 
strcat(config_file_location,"/.config"); 

或:

char *config_file_location; 
config_file_location = (char *) malloc(43); 
strcpy (config_file_location, getenv("HOME")); 
strcat(config_file_location,"/.config"); 
//code goes here 
free(config_file_location); 

也應該我在上面的例子中使用的realloc獲得準確使用它應該的內存量的config_file_location?

我正在尋找最佳實踐信息,如果它不值得在這種情況下做,我想知道它什麼時候會,而且我想知道背後哪種方法更好。

謝謝,我很感激。

+2

你確定主目錄的形式始終是'/ home/username'嗎?不要做出這樣的假設。例如,我的主目錄位於'/ export/home/fuz'中,並且我的主目錄是'/ pub/homesrv/department/home/username'。 – fuz

+1

如果你有一個數組,你不必擔心內存泄漏,如果你有一個動態分配的緩衝區,你就不必擔心它會變小。 –

+1

你「知道」最長的config_file_location是46個字符......當你的代碼崩潰時,記住一個最重要的調試規則:你知道什麼是錯誤的。正如@FUZxxl已經告訴你的那樣。 – gnasher729

回答

2

有兩個原因,爲什麼你會使用動態分配:

  • 有的是因爲所需的內存量不是在編譯時已知的,或者因爲需要的內存量的遊程被重新分配時間。
  • 或者因爲您需要分配大量數據,並且不想用它來支撐堆棧。在堆棧上分配太多內存最糟糕的情況會導致由堆棧溢出引起的神祕的運行時崩潰。爲避免這種情況,應該在堆上分配大量數據。

在你的情況,你有一個固定的數據量和43個字節是一個很大的數額。所以在這裏不需要使用動態分配。

除了內存泄漏和堆碎片的常見問題之外,您還必須考慮對malloc(和free)的每次調用都非常耗時。在動態分配可行的系統(比如Linux)上,對速度進行優化而不是內存消耗幾乎總是更有意義。

2

除非你在一些真正的,真正的內存受限的環境中工作,否則我不會擔心優化你的應用程序使用多少內存。只需在堆棧上爲您可能遇到的最大路徑分配一個「足夠大」的緩衝區即可。

至於有多大,沒有人會給你一個明確的答案。你可以使用PATH_MAX,儘管它有noted即使有問題。在這些情況下,我會採取一種務實的方式,去尋找像256字節的東西。任務完成。繼續。