Вы должны иметь соглашение, что только указатели перед значением дозорного (например, NULL
) должны быть освобождены.
void destroy (int ***matrix) {
if (matrix == NULL) return;
for (int i = 0; matrix[i]; ++i) {
for (int j = 0; matrix[i][j]; ++j) {
free(matrix[i][j]);
}
free(matrix[i]);
}
free(matrix);
}