2012-09-11 73 views
3

我試着重新分配一個尺寸從2X2到3X3的2D float陣列。代碼拋出segfault,同時嘗試realloc內存weights[2]如何爲2D浮點數組重新分配內存?

num_vertices = 2; 
float **weights = malloc(num_vertices*sizeof(float *));  // weight array matrix 
for(i = 0; i < num_vertices; i++){ 
    weights[i] = malloc(num_vertices*sizeof(float)); 
} 

num_vertices = 3; 
weights = realloc(weights, num_vertices*sizeof(float *));  // weight array matrix 
for(i = 0; i < num_vertices; i++){  
    weights[i] = realloc(weights[i], num_vertices*sizeof(float)); 
} 

當然,我可以再次free二維數組和malloc,但我一直在尋找一個更好的解決方案。有任何想法嗎?

回答

5

問題是,weights[2]包含垃圾後,你realloc weights

你可能想要做這樣的事情:

new_vertices = 3; 
weights = realloc(weights, new_vertices*sizeof(float *)); 
for(i = 0; i < new_vertices; i++) 
{ 
    if (i >= num_vertices) 
     weights[i] = NULL; 
    weights[i] = realloc(weights[i], new_vertices*sizeof(float)); 
} 
num_vertices = new_vertices; 

注意,你有一個潛在的內存泄漏,如果realloc的不斷失敗。既然你沒有檢查錯誤,儘管現在這可能並不重要。

+1

對於realloc中的NULL指針+1。不知道。謝謝。 – zubergu

3

weights[2]的realloc的試圖realloc的未分配的內存,因爲weights[2]從來沒有分配任何指針。

通常,如果你想要一個二維數組,只需使用wegihts[width*y + x]來索引數組,而不是製作一個指針數組。

2

不能循環到頂點計數,作爲外部陣列的部分還沒有分配,幷包含未初始化的數據。取而代之的是循環到新的num_vertices - 1並重新分配,然後創建一個全新的weights[num_verticees - 1]