2012-02-14 71 views
0

過去幾天我一直在爲C類的任務開展工作,並且遇到了關於在C中的realloc()函數的奇怪崩潰。即使是C /內部的C++程序員無法立即回答我的代碼可能出錯的原因。通過調用realloc()幾次導致C程序崩潰

首先,我在一個函數創建的內存塊:

char *line = (char *)malloc(sizeof(char) * BUFSIZE); 

然後我打電話getMoreBuf(start_of_block, end_of_block)

int getMoreBuf(char *start, char *end) 
{ 
char *newBuf = 0; 
int newSize = (end - start) + BUFSIZE; 
    newBuf = (char *)realloc(start, sizeof(char) * newSize); 
    if(NULL == newBuf) { 
     printf("No virtual RAM available"); 
    }else{ 
     start = newBuf; 
    } 
    return newSize; 
} 

取決於我設置爲,其第5通話後崩潰BUFSIZE(BUFSIZE = 1)或第三次調用(BUFSIZE = 5),並用廢話替換讀入的字符。

難道有人指向我的錯誤並給出建議在哪裏閱讀以解決它們? 任何幫助表示讚賞。 :)

Bonus問題:我malloc一個內存塊,其中指針1指向的開始和指向後面的指針2 point2指向內存塊中的單個塊。我realloc()塊和塊由於大小問題而移動,指針2是否仍舊指向舊的(現在無用的)塊,或者是否會隨着realloc「移動」到內存塊的新位置?

(也對於未來,我應該把額外的問題,到一個新的問題,或者我可以留在這兒,因爲它是密切相關的第一個問題?)

感謝大家的投入,它幫助我瞭解出了什麼問題。 如果我能我將每個標記爲正確答案,因爲每個幫助我以某種形式瞭解更多關於這些該死的指針業務。 =)

+0

[*即使程序員*](http://c-faq.com/ptrs/passptrinit。html)也許你應該試過C程序員? – cnicutar 2012-02-14 08:58:02

+0

是的,我試過一個C和一個C++程序員,我只是忘了提到這一點。我解決了這個問題,我會查看鏈接。 – Plastefuchs 2012-02-14 09:08:58

回答

2

我認爲你的問題是,你只能改變局部變量start ...你需要使用一個指針。

int getMoreBuf(char **start, char **end) 
{ 
    char *newBuf = 0; 
    int newSize = (*end - *start) + BUFSIZE; 
    newBuf = (char *)realloc(*start, sizeof(char) * newSize); 
    if(NULL == newBuf) { 
     printf("No virtual RAM available"); 
    } else { 
     *start = newBuf; 
     *end = *start + newSize; 
    } 
    return newSize; 
} 

然後你把它想:

getMoreBuf(&start_of_block, &end_of_block) 
+2

請注意,'end'可能也需要重新計算,否則'newSize'的計算會輸出錯誤的值... – 2012-02-14 09:04:13

+0

@Martin:你是對的。編輯該文件。 – cha0site 2012-02-14 09:10:43

+0

謝謝你的回答!我希望有一點點的意見可以自行解決,但這也是有效的。我希望下次能夠記住這一切。 :) – Plastefuchs 2012-02-14 09:12:28

3

此:

start = newBuf; 

正在修改start。但是start是一個局部變量;它不會影響調用者所具有的變量。

要解決這個問題,您需要將start作爲指針指針,或者您需要返回newBuf

+0

@Plastefuchs:不,它不會。您需要修改指針本身,因此您需要將指針傳遞給它,即指針指針。 – 2012-02-14 09:05:56

+0

謝謝你的回答,它幫助我過度了一些我認爲我已經知道的指針和函數的東西。 – Plastefuchs 2012-02-14 09:13:11

2

的問題是,start的新值不會被傳遞出來的getMoreBuf()功能 - 你需要一個雙指針要做到這一點,即你的函數原型將需要看起來像這樣:

int getMoreBuf(char **start, char **end); 

(我做了一個end雙指針也因爲您可能需要計算爲一個新值了。)

+0

感謝您的快速回答! – Plastefuchs 2012-02-14 09:13:48