Вы не перераспределяете то, что вы думаете.
Когда вы делаете это:
*x = (int**)realloc(*x,nNew*sizeof(int*));
для (int i = 0; i
, поскольку x
имееттип int **
, *x
имеет тип int *
. Кроме того, *x
совпадает с x[0]
. Таким образом, вы не перераспределяете массив указателей в первой строке, а первый массив int
.Вам нужно вызвать realloc
для исходного указателя, и , вам нужно передать адрес этого указателя, чтобы изменение было видно в вызывающей программе.
Затем для перераспределенияДля отдельных массивов вам нужно вызвать realloc
на исходном n
, чтобы увеличить или уменьшить их, затем либо free
дополнительные строки, если они растут, либо malloc
новые добавленные строки. В случае роста вы хотите realloc
массив указателей fisrt, и в случае сокращения вы хотите сделать это последним.
Так что после этих изменений ваша функция update
должна выглядеть так:
void update(int ***x, int n, int nNew)
{
if(n>nNew) {
// shrink each row to be kept
for(int i=0;i<nNew;i++)
(*x)[i] = realloc((*x)[i],nNew*sizeof(int));
// free the extra rows
for(int i=nNew;i<n;i++)
free((*x)[i]);
// shrink the list of rows
*x = realloc(*x,nNew*sizeof(int*));
} else if(n<nNew) {
// grow the list of rows
*x = realloc(*x,nNew*sizeof(int*));
// grow the existing rows
for(int i=0;i<n;i++)
(*x)[i] = realloc((*x)[i],nNew*sizeof(int));
// create the new rows
for(int i=n;i<nNew;i++)
(*x)[i] = malloc(nNew*sizeof(int));
}
}
ИВы называете это так:
update(&x,n,nNew);