2017-07-07 73 views
-3

我想將文件名路徑存儲在char變量中,稍後通過函數調用傳遞它。要做到這一點,我聲明瞭以下字符緩衝區:打印字符緩衝區時出現問題

char *filename_path = malloc(100* sizeof(char)); 

現在,爲了測試,我賦予它使用的路徑,然後打印緩衝區的值,以確保它非常適合。

filename_path= "../Datasets/Cluster(%d)%s"; 
printf("%s\n", filename_path); 
... 
free(filename_path); 

不過,我得到這個錯誤:

../Datasets/Cluster(%d)%s 
k.out(1154,0x7fff9843c3c0) malloc: *** error for object 0x103fbbacb: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 
Abort trap: 6 

可有人暗示我在哪裏,這個問題可能是什麼?謝謝

+0

你只能被'malloc'返回的'free'指針。 – melpomene

+0

@melpomene謝謝你的回答。你能在這種情況下展示如何釋放! – Don

+3

'p = malloc(...); p = ...'是內存泄漏。你正在覆蓋'malloc'返回的指針。 – melpomene

回答

2

filename_path= "../Datasets/Cluster(%d)%s"; 

不復制字符串字面到內存中的內容,將filename_path;它用字符串文字的地址覆蓋的值filename_path。您基本上將從malloc返回的值丟棄,導致a)內存泄漏,以及b)調用free時出現錯誤。

除了使用賦值運算符,使用strcpy功能:

strcpy(filename_path, "../Datasets/Cluster(%d)%s"); 
0

的問題是,您需要將原來的指針保存以釋放它:

所以存儲臨時指針和自由,與其。

char *filename_path ,*temp_path; 
filename_path = malloc(100* sizeof(char)); 
temp_path = filename_path; 

//your code for filename_path 

free(temp_path); 
0

看看這樣說:

  1. 您分配100個字節的內存和分配filename_path指針指向分配的內存。

  2. 您現在將更改爲filename_path指向靜態字符串「../Datasets/Cluster(%d)%s」。

  3. 由於您更改了filename_path指向的位置,您不再有指向先前分配的內存的指針,也不再有任何方法釋放它。

  4. 當您嘗試釋放filename_path時,您實際上正在嘗試釋放靜態字符串「../Datasets/Cluster(%d)%s」,當然如錯誤消息所示,它實際上並未由malloc分配。

1

您的代碼覆蓋malloc返回的指針,並使用一個新的常量字符串(filename_path = "../Datasets/Cluster(%d)%s"行)覆蓋。那就是試圖釋放它。

你不能那樣做,因爲指針與malloc返回的指針不一樣。

要將您的內容複製到您的malloc'ed字符串中,您應該使用strncpy

像這樣:

char *filename_path = malloc(100* sizeof(char)); 

strncpy(filename_path, "../Datasets/Cluster(%d)%s", 100); 
printf("%s\n", filename_path); 

free(filename_path); 
0

的問題是對字符串的malloc()內存位置的文字如filename_path= "../Datasets/Cluster(%d)%s";

malloc()分配內存,返回一個指向該內存的指針。字符串文字位於其他地方完全 - 通常在靜態/數據(看到這篇文章的更多信息where in memory are string literals ? stack/heap?

由於您指定filename_path指向某處,而不是你mableced,你無法釋放它。