目前我正在尝试使用此代码段
在C中调整2D数组的大小array = (int**) realloc(array, s * 2 * sizeof(int));
其中s是行和列中数组的大小。但是,当试图像这样访问数组的新区域时,
array[3][0] = x;
我只得到一个段错误。阵列的旧区域工作正常。我该如何解决这个问题?
答案 0 :(得分:8)
假设您将array
声明为
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
,如果将其分配回原始变量,您将失去对先前分配的内存的唯一引用,从而导致内存泄漏。