c - 在 C 中调整二维数组的大小

标签 c arrays memory-management multidimensional-array

目前我正在尝试使用此代码片段调整 C 中的二维数组的大小

array = (int**) realloc(array, s * 2 * sizeof(int));

其中 s 是数组的大小(以行和列为单位)。但是,当尝试像这样访问数组的新区域时,

array[3][0] = x;

我只遇到段错误。阵列的旧区域工作正常。我该如何解决这个问题?

最佳答案

假设您将数组声明为

int **array;

并分配为

array = malloc( sizeof *array * ROWS );
if ( array )
{
  for ( size_t i = 0; i < ROWS; i++ )
    array[i] = malloc( sizeof *array[i] * COLS );
}

你最终得到的结构看起来像这样:

       +---+        +---+                  +---+
array: |   | -----> |   | array[0] ------> |   | array[0][0]
       +---+        +---+                  +---+
        ...         |   | array[1] ---+    |   | array[0][1]
                    +---+             |    +---+
                     ...              |    |   | array[0][2]
                                      |    +---+
                                      |     ...
                                      |    
                                      |    +---+
                                      +--> |   | array[1][0]
                                           +---+
                                           |   | array[1][1]
                                           +---+
                                           |   | array[1][2]
                                           +---+
                                            ...

如果您想增加数组中的行数但保持列大小不变,您可以执行类似的操作

int **tmp = realloc( array, sizeof *array * (ROWS + add_rows) );
if ( tmp )
{
  array = tmp;
  for ( size_t i = 0; i < add_rows; i++ )
  {
     array[ROWS + i] = malloc( sizeof *array[ROWS + i] * COLS );
  }
}

如果您想保持行数不变,但增加每行中的列数,您可以这样做

for ( size_t i = 0; i < ROWS; i++ )
{
  int *tmp = realloc( array[i], sizeof *array[i] * (COLS + add_cols) );
  if ( tmp )
  {
    array[i] = tmp;
  }
}

如果您想减少数组中的行数,则需要先释放受影响的行:

for ( size_t i = 1; i <= del_rows; i++ )
  free( array[ROWS - i] );

int *tmp = realloc( array, ROWS - del_rows );
if ( tmp )
  array = tmp;

如果您想减少列数:

for ( size_t i = 0; i < ROWS: i++ )
{
  int *tmp = realloc( array[i], sizeof *array[i] * (COLS - del_cols) );
  if ( tmp )
    array[i] = tmp;
}

从那里,您应该能够找出您需要的任何组合。我强烈建议一次只执行一个维度(也就是说,如果您想增加行列数,请首先执行行>,然后做列)。

总是希望将realloc的结果分配给临时变量;如果realloc无法满足请求,它将返回NULL,如果将其分配回原始变量,您将丢失对先前分配的内存的唯一引用,导致内存泄漏。

关于c - 在 C 中调整二维数组的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43212414/

相关文章:

arrays - 根据数组中元素的个数,获取包含元素的数组出现的频率

java - java 堆中对象数量的增加可以作为指示吗?

c - 开源 ANSI C99 解析器?

java - 当类中定义数组大小时,为什么会出现 ArrayIndexOutOfBounds 异常?

在 C 中创建和打印动态 float 组

c# - List<Func<double, double>> 会导致内存泄漏吗?

c - 按位或运算符 | C 中用于对齐内存块的用法

在 C 代码中找不到段错误

c - 下面的二叉搜索树插入方法有什么问题?

c - 输入字符串数组不会显示?