2017-04-20 206 views
0

我工作的學校一些代碼,和這裏的的是我遇到一些麻煩的代碼片段:「的realloc():無效的指針」錯誤

// Create file path 
int size_path = 11; 
char* path = malloc(size_path*sizeof(char)); 
path = "./storage/\0"; 
for(i = 0; i < size_filename; i++){ 
    size_path++; 
    path = realloc(path, size_path*sizeof(char)); 
    path[size_path-1] = filename[i]; 
} 
path[size_path] = '\0'; 

從本質上講,我在做什麼試圖找到一個文件的存在(例如,test.txt),所以我需要使用access()來檢查它的存在,但首先我需要建立path本身,使得path = "./storage/test.txt"我已經使用上面的方法來解析一些其他的東西,所以我知道我做的工作方式,我只是覺得我在這裏錯過了一些東西,因爲每當我嘗試運行代碼時,我都會在編譯器中看到一個錯誤:*** Error in ./a.out: realloc(): invalid pointer: 0x00000000004016c7 ***

我很好奇看到你們能提供給我的洞察力,因爲我一直在研究這個bug至少半小時,而社區幫助我在幾分鐘內解決了許多問題,所以我我確定這只是一個錯誤的事情,但我無法弄清楚它會是什麼。提前致謝!

編輯:正如我的想象,我在5分鐘內得到了我的問題的答案。事實證明,我不小心將動態分配的內存泄露,實際上並沒有將任何東西放入其中,並在之後直接靜態分配。相反,我使用strcpy(path, "./storage/"),我得到了我正在尋找的功能。謝謝!

+0

閱讀[問],特別是關於[作業問題]的部分(https://meta.stackoverflow.com/questions/334822/how-do-i-ask-and-answer-homework-questions)。 – Olaf

+1

'path =「./storage/\0」;'用'char * path = malloc(size_path * sizeof(char))初始化'path'';'這會泄漏先前的分配。 – chux

+3

推測,'path =「./storage/\0」;'應該是'strcpy(path,「./storage /」);' – ShadowRanger

回答

3
char* path = malloc(size_path*sizeof(char)); 
path = "./storage/\0"; 

所以路徑指向某些動態分配的內存,然後在下一行你說path = something_else這樣:

  1. 你已經泄露了動態分配的內存(因爲你沒有指針它了,所以不能得到free吧)
  2. 你不能realloc非動態內存

法b對它的訪問根據問題的線條,我建議你根本不需要動態記憶。你可以只用一個固定大小的緩衝區:

char path[128]; // arbitrary limit that we "know" is ok given our data 
char* filename = "test.txt"; 
sprintf(path, "/storage/%s", filename); 

顯然,這是專爲假設的文件名可能真正改變基於一些數據,否則一大堆可能是一個文本字符串。

+0

這是正如我想的那樣,所以可能像上面提到的評論者那樣,我應該使用'strcpy()'將我想要的字符串存入分配的內存中。非常感謝! –

+0

您是否首先需要動態內存?你當然不需要'realloc'。你可以使用一個固定大小的緩衝區作爲起點... – John3136

+0

我想你是對的;我可以使用固定的緩衝區並獲得相同的結果。無論哪種方式,我很高興我現在知道這個問題出現時的未來 –