Z pliku binarnego ładuję do dwuwymiarowej tablicy wartości int. Końcem wiersza jest -1. Tablicę realokuję po drodze:
while (fread(&num, sizeof(int), 1, file) == 1) {
if (columns == 0) { //pierwszy element wiersza
tmp2 = (int**)realloc(arr, (row + 1) * sizeof(int*)); //realokacja wierszy
if (!tmp2) { //czyszczenie w przypadku niepowodzenia
fclose(file);
for (int k = 0; k < row; k++) {
free(*(arr + k));
}
free(arr);
return 4;
}
arr = tmp2;
*(arr + row) = NULL;
columns++;
}
tmp1 = (int*)realloc(*(arr + row), columns * sizeof(int)); //reaolokacja kolumn
if (!tmp1) { // czyszczenie w przypadku niepowodzenia
fclose(file);
for (int k = 0; k < row; k++) {
free(*arr + k);
}
free(arr);
return 4;
}
*(arr + row) = tmp1;
*(*(arr + row) + columns - 1) = num;
if (num == -1) {
row++;
columns = 0;
}
else
columns++;
}
Tablica napełnia się prawidłowo, funkcja wyświetlająca dane działa prawidłowo, niestety podczas zwalniania pamięci:
void destroy(int ***ptr) {
if (*ptr != NULL) {
int** p = *ptr;
int i=0;
while (*(p+i) != NULL) {
free (*(p+i));
*(p+i)=NULL;
i++;
}
free(p);
*ptr = NULL;
}
return;
}
już przy pierwszym wywołaniu free(*(p+i)) otrzymuję komunikat: Wykryto naruszenie granic bloku pamięci.
W czym tkwi problem?
pozdrawiam
Rafał