2017-04-03 78 views
1

我得到了二維的動態分配表。調整表格的大小。調整二維動態分配表的分段錯誤

1)創建一個新的。

2)刪除先前的指針,分配的內存。

3)分配新指針。

代碼:

#include <stdio.h> 
#include <stdlib.h> 

int** create(int rows, int columns) 
{ 
    int **tab = (int**)malloc(rows * sizeof(int*)); 
    int i=0; 
    for(;i<rows; ++i) 
    { 
     tab[i] = (int*)malloc(columns * sizeof(int)); /* tab[i] = (int*)calloc(columns , sizeof(int)); */ 
    } 

    return tab; 
} 
void deleteTab(int **tab, int rows) 
{ 
    int i=0; 
    for(;i<rows;++i) 
    { 
     free(tab[i]); 
    } 
    free(tab); 
} 
void resize(int **tab, int oldRows, int newRows, int newColumns) 
{ 
    int **newTab=create(newRows, newColumns); 
    deleteTab(tab, oldRows); 
    tab=newTab; 
} 
void printTab(int **tab, int rows, int columns) 
{ 
    int i=0, j=0; 
    for(i=0;i<rows;++i, printf("\n")) 
    { 
     for(j=0;j<columns;++j) 
     { 
      printf("%i ", tab[i][j]); 
     } 
    } 
} 
int main() 
{ 
    int **tab=create(4,7); 
    resize(tab,4,8,9); 
    int i=0, j=0; 
    for(i=0;i<8;++i) 
    { 
     for(j=0;j<9;++j) 
     { 
      tab[i][j]=3; 
     } 
    } 
    printTab(tab,8,9); 
} 

輸出: 分段故障。

這是調整表格的好方法/算法嗎?如何省略分段錯誤錯誤?

+3

'resize'應該返回'newTab'而不是分配給* *本地**「標籤」。 – StoryTeller

+0

也有沒有明顯的原因,你應該首先在這裏使用指針指針。請參閱[正確分配多維數組](http://stackoverflow.com/questions/42094465/correctly-allocating-multi-dimensional-arrays)。 – Lundin

回答

0

resize必須返回newtab。該參數按值傳遞。或者你可以讓tab作爲表的指針和改變你這樣的代碼

void resize(int ***tab, int oldRows, int newRows, int newColumns) 
{ 
    int **newTab=create(newRows, newColumns); 
    deleteTab(*tab, oldRows); 
    *tab=newTab; 
} 

,並調用它像這樣:

int main() 
{ 
    int **tab=create(4,7); 
    resize(&tab,4,8,9); //note 'tab' now pass-by-pointer 
    //... 
}