Tengo algunos problemas para producir una matriz int sin crear pérdidas de memoria. Quiero poder hacer una matriz dada (global) en cualquier tamaño dinámicamente a través de read_matrix(). Pero luego quiero poder liberar la memoria más adelante. Por lo tanto, en mi método principal, la segunda impresión debería dar como resultado un error de bus ya que no debería tener ninguna memoria asignada. ¿Cómo podría crear esto?matriz int con punteros en confusión de asignación de memoria C
int** first_matrix;
int** second_matrix;
int** result_matrix;
int** read_matrix(int size_x, int size_y)
{
int** matrix;
matrix = calloc(size_x, sizeof(int*));
for(int i = 0;i<size_x;i++) {
matrix[i] = calloc(size_y, sizeof(int));
}
for(int i = 0;i<size_x;i++) {
for(int j = 0;j<size_y;j++) {
matrix[i][j] = i*10+j;
}
}
return matrix;
}
int main(int stackc, char** stack)
{
first_matrix = read_matrix(10,10);
printf("9:3 %d - 4:6 %d \n", first_matrix[9][3], first_matrix[4][6]);
free(*first_matrix);
free(first_matrix);
printf("9:3 %d - 4:6 %d \n", first_matrix[9][3], first_matrix[4][6]);
}
parece que el bucle hasta la matriz [i]! = NULL funciona incluso si no configuro el último apuntador a NULL, ¿es esta coincidencia/algo diferente? – Fredrik
Si asigna un puntero adicional y no lo establece, * puede * predeterminado a NULL, dependiendo del sistema operativo (Windows borra la memoria asignada, Unix no lo hace). Si no es así, se ejecutará fuera del final de la matriz asignada y seguirá liberando cosas hasta que golpee un puntero NULL o (más probable) bloquee. –
calloc siempre establece la memoria en nulo. – quinmars