在C语言中调整2D数组的大小

在C语言中调整2D数组的大小,c,arrays,memory-management,multidimensional-array,C,Arrays,Memory Management,Multidimensional Array,目前,我正试图使用此代码段在C中调整2D数组的大小 array = (int**) realloc(array, s * 2 * sizeof(int)); 其中s是数组的大小,以行和列为单位。但是,当尝试像这样访问阵列的新区域时 array[3][0] = x; 我只犯了一个错误。阵列的旧区域工作正常。如何解决此问题?假设您将数组声明为 int **array; 并分配为 array = malloc( sizeof *array * ROWS ); if ( array ) { f

目前,我正试图使用此代码段在C中调整2D数组的大小

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 );
}
如果要增加数组中的行数,但保持列大小不变,可以执行以下操作

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;
  }
}
int**tmp=realloc(数组,sizeof*array*(行+添加行));
如果(tmp)
{
阵列=tmp;
对于(大小i=0;i
如果希望保持行数不变,但增加每行中的列数,可以执行以下操作

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;
  }
}
(大小i=0;i { int*tmp=realloc(数组[i],sizeof*array[i]*(COLS+add_COLS)); 如果(tmp) { 数组[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;

用于(size_t i=1;我确信
array
是一个数组?指针不是数组。指向指针的指针并不意味着数组的数组。请构造一个。您是如何声明
array
的,最初是如何分配的?假设您正确声明了
array
,并且修复了编译器发出的所有警告使用
realloc()是一个基本错误
。这些函数都会在出现故障时返回
NULL
,在这种情况下,您会丢失对原始指针的引用,从而导致内存泄漏。使用临时变量,根据
s
的值,您可能会请求不可用的内存量,因此请检查
arry
之前的
NULL
ay[3][0]=x
,最后但并非最不重要的一点是不要强制转换
malloc()的返回值。