Глядя на это, я не могу понять ... Посмотрите на комментарий 1, у вас n
установлен где-то на realloc
блок памяти, который a
имеет тип int **
- двойной указатель, как вы вызываете эту функцию? Во-вторых, комментарий 2. Почему вы вызывали calloc
, когда ранее вызывался realloc
для двойного указателя ...? Предположим, что n
имеет значение 5, тогда realloc
вызывается по двойному указателю a
, что означает a[0][1]..a[4][1]
, теперь calloc
вызывается, таким образом a[4]
имеет новый блок памяти ...
void InsertZero(int **a, int pos){
int i, j;
/* 1. */
a = (int**)realloc(a, n * sizeof(*a));
/* Bzzzzt....if realloc failed, a gets overwritten! */
/* 2. */
a[n-1] = (int*)calloc(n, sizeof(**a));
/* 3. */
d = 0;
/* 4. */
for(i = n-1; i > pos; i--){
for(j = 0; j < n; j++){
a[i][j] = a[i-1][j];
printf("%d ", a[i][j]);
}
}
for(i = 0; i < n; i++){
a[pos][i] = 0;
}
}
Комментарий 3, для чего используется d
- бесполезная переменная?
Комментарий 4, вы предполагаете, что блок памяти имеет индексы массива от [0][0]
до [4][4]
, если n
имеет значение 5!
Можете ли вы уточнить все это?
Редактировать: Глядя на это снова ... вполне вероятно, что a
был перезаписан при сбое вызова realloc
! Я рекомендую этот раздел кода, чтобы противодействовать этому
int **tmpA;
tmpA = (int**)realloc(a, n * sizeof(*a));
if (tmpA != NULL){
a = tmpA;
....
a[n-1] = (int*)calloc(n, sizeof(**a));
for(i = n-1; i > pos; i--){
....
}
for(i = 0; i < n; i++){
....
}
}