2017-04-03 38 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 
    //... 
}