ayer que había publicado una pregunta: How should I pass a pointer to a function and allocate memory for the passed pointer from inside the called function?Programación C: malloc() para una matriz 2D (usando puntero a puntero)
partir de las respuestas que recibí, yo era capaz de entender lo error que hacía.
Estoy enfrentando un nuevo problema ahora, ¿alguien puede ayudarme con esto?
que desea asignar dinámicamente una matriz 2D, por lo que estoy pasando un puntero a puntero de mi main()
a otra función llamada alloc_2D_pixels(...)
, donde uso malloc(...)
y for(...)
bucle para asignar memoria para la matriz 2D.
Bueno, después de regresar de la función alloc_2D_pixels(...)
, el puntero a puntero sigue siendo NULO, así que, naturalmente, cuando intento acceder o trato de free(...)
Puntero-a-Puntero, el programa se bloquea.
¿Alguien puede sugerirme qué errores estoy haciendo aquí?
Ayuda !!!
Vikram
FUENTE:
main()
{
unsigned char **ptr;
unsigned int rows, cols;
if(alloc_2D_pixels(&ptr, rows, cols)==ERROR) // Satisfies this condition
printf("Memory for the 2D array not allocated"); // NO ERROR is returned
if(ptr == NULL) // ptr is NULL so no memory was allocated
printf("Yes its NULL!");
// Because ptr is NULL, with any of these 3 statements below the program HANGS
ptr[0][0] = 10;
printf("Element: %d",ptr[0][0]);
free_2D_alloc(&ptr);
}
signed char alloc_2D_pixels(unsigned char ***memory, unsigned int rows, unsigned int cols)
{
signed char status = NO_ERROR;
memory = malloc(rows * sizeof(unsigned char**));
if(memory == NULL)
{
status = ERROR;
printf("ERROR: Memory allocation failed!");
}
else
{
int i;
for(i = 0; i< cols; i++)
{
memory[i] = malloc(cols * sizeof(unsigned char));
if(memory[i]==NULL)
{
status = ERROR;
printf("ERROR: Memory allocation failed!");
}
}
}
// Inserted the statements below for debug purpose only
memory[0][0] = (unsigned char)10; // I'm able to access the array from
printf("\nElement %d",memory[0][0]); // here with no problems
return status;
}
void free_2D_pixels(unsigned char ***ptr, unsigned int rows)
{
int i;
for(i = 0; i < rows; i++)
{
free(ptr[i]);
}
free(ptr);
}
Hey Mark !!! :) Sí, tienes razón, debería haber publicado un código de trabajo. Gracias por su respuesta detallada, lo aprecio. – HaggarTheHorrible