c - 调整二维动态分配表大小时出现段错误

标签 c arrays resize malloc free

<分区>

我有二维的、动态分配的表。调整表格大小。

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);
}

输出: 段错误。

调整表格大小是否是一种好方法/算法?如何省略segmentation fault错误?

最佳答案

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
    //...
}

关于c - 调整二维动态分配表大小时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43178326/

相关文章:

c - 搜索数据并将数据从一个文件写入另一个文件

c - 为什么只有 2 个线程处于事件状态时 pthread_create() 会失败?

arrays - 如何检查对象是否是 TypeScript 中的只读数组?

java - 如何调整 JScrollPane 中绑定(bind)的 JTextPane 组件的大小

c - R 不会引用/找不到编译后加载的 C 代码

c - 标记数据包以通过原始套接字发送

python - 我的 numpy 数组在 cython 中表现异常

php - 我如何以正确的格式获取这些数据?

image - 强制 Wordpress 创建与上传图片大小相同的缩略图

jquery - 调整大小时更新 jQuery 函数中的值