problema de memoria con malloc
Saludos a todos.
Bueno en esta ocacion queria pedirles un favor HAGANME LA TAREA!
No mentiras, realmente es solo un favor .
Resumen:
Algo falla al asignar memoria con malloc despues de 964 veces dentro de un ciclo, pero no me arroja error sino al ejecutar el programa.
Explicacion completa:
Estoy desarrollando un programa en el cual necesito crear una matriz dinamicamente, ya he implementado la funcion para hacerlo , pero por alguna extraña razon cuando llega a cierto punto dentro del ciclo se me revienta el programa...
CODE
char **getDotMatrix(bitmapType *bmp)
{
char **matrix;
char *msg;
int x=0, y=0,i=0,j=0, bytesPerCol = bmp->bitsPerPixel/8;
msg=(char*)malloc(255);
memset(msg,' ',255);
matrix = (char **)malloc(bmp->width*bytesPerCol);
if(matrix != NULL)
{
// memset(matrix, ' ', sizeof(matrix));
for(x=0;x < (bmp->width*bytesPerCol);x++)
{
matrix[x] = (char *)malloc(bmp->height);
if(matrix[x]!=NULL)
{
//memset(matrix[x], ' ', bmp->height);
if((x+1)%964==0)
x=x;
}
else
{
strcpy(msg,"Error al asignar memoria a la matrix[x]: ");
allegro_message(msg);
}
}
/*for(y=0;y<bmp->height;y++)
{
for(x=0;x<bmp->width*bytesPerCol;x++)
{
for(j=2;j>=0;j++)
{
matrix[x][y] = bmp->bmpData[i+j];
x++;
}
x--;
i+=bytesPerCol;
}
}*/
}
else
{
strcpy(msg,"Error al asignar memoria a la matrix: ");
allegro_message(msg);
}
return matrix;
}
He controlado todo lo que parece estar a mi alcance, al utilizar malloc no me devuelve NULL o sea que se supone que ha funcionado bien pero en este segmento:
CODE
for(x=0;x < (bmp->width*bytesPerCol);x++)
{
matrix[x] = (char *)malloc(bmp->height);
if(matrix[x]!=NULL)
{
//memset(matrix[x], ' ', bmp->height);
if((x+1)%964==0)
x=x;
}
else
{
strcpy(msg,"Error al asignar memoria a la matrix[x]: ");
allegro_message(msg);
}
}
como se puede obervar hasta al llegar x=964 todo funciona bien pero en la siguiente asignacion de memoria:
matrix[x] = (char *)malloc(bmp->height);
Me sale este mensaje en el compilador:
QUOTE
Excepción no controlada en 0x77f65a58 en Bitmap.exe: Punto de interrupción del usuario.
Estos son lo valores de las variables al momento anterior al error, no estan los de el contenido de los apuntadores porque no caben, sin embargo:
bmp->with = 640
bmp->heigth= 480
bmp->bitsPerPixel =24
QUOTE
bytesPerCol 3 int
i 0 int
x 963 int
y 0 int
Les agradezco de antemano cualquier ayuda que me puedan prestar
ya que llevo dos dias con esto y no he logrado resolverlo
Con valores pequeños todo funciona normal.
Bueno en esta ocacion queria pedirles un favor HAGANME LA TAREA!
No mentiras, realmente es solo un favor .
Resumen:
Algo falla al asignar memoria con malloc despues de 964 veces dentro de un ciclo, pero no me arroja error sino al ejecutar el programa.
Explicacion completa:
Estoy desarrollando un programa en el cual necesito crear una matriz dinamicamente, ya he implementado la funcion para hacerlo , pero por alguna extraña razon cuando llega a cierto punto dentro del ciclo se me revienta el programa...
CODE
char **getDotMatrix(bitmapType *bmp)
{
char **matrix;
char *msg;
int x=0, y=0,i=0,j=0, bytesPerCol = bmp->bitsPerPixel/8;
msg=(char*)malloc(255);
memset(msg,' ',255);
matrix = (char **)malloc(bmp->width*bytesPerCol);
if(matrix != NULL)
{
// memset(matrix, ' ', sizeof(matrix));
for(x=0;x < (bmp->width*bytesPerCol);x++)
{
matrix[x] = (char *)malloc(bmp->height);
if(matrix[x]!=NULL)
{
//memset(matrix[x], ' ', bmp->height);
if((x+1)%964==0)
x=x;
}
else
{
strcpy(msg,"Error al asignar memoria a la matrix[x]: ");
allegro_message(msg);
}
}
/*for(y=0;y<bmp->height;y++)
{
for(x=0;x<bmp->width*bytesPerCol;x++)
{
for(j=2;j>=0;j++)
{
matrix[x][y] = bmp->bmpData[i+j];
x++;
}
x--;
i+=bytesPerCol;
}
}*/
}
else
{
strcpy(msg,"Error al asignar memoria a la matrix: ");
allegro_message(msg);
}
return matrix;
}
He controlado todo lo que parece estar a mi alcance, al utilizar malloc no me devuelve NULL o sea que se supone que ha funcionado bien pero en este segmento:
CODE
for(x=0;x < (bmp->width*bytesPerCol);x++)
{
matrix[x] = (char *)malloc(bmp->height);
if(matrix[x]!=NULL)
{
//memset(matrix[x], ' ', bmp->height);
if((x+1)%964==0)
x=x;
}
else
{
strcpy(msg,"Error al asignar memoria a la matrix[x]: ");
allegro_message(msg);
}
}
como se puede obervar hasta al llegar x=964 todo funciona bien pero en la siguiente asignacion de memoria:
matrix[x] = (char *)malloc(bmp->height);
Me sale este mensaje en el compilador:
QUOTE
Excepción no controlada en 0x77f65a58 en Bitmap.exe: Punto de interrupción del usuario.
Estos son lo valores de las variables al momento anterior al error, no estan los de el contenido de los apuntadores porque no caben, sin embargo:
bmp->with = 640
bmp->heigth= 480
bmp->bitsPerPixel =24
QUOTE
bytesPerCol 3 int
i 0 int
x 963 int
y 0 int
Les agradezco de antemano cualquier ayuda que me puedan prestar
ya que llevo dos dias con esto y no he logrado resolverlo
Con valores pequeños todo funciona normal.
En principio, yo te diría que cambies esta línea:
//matrix = (char **)malloc(bmp->width*bytesPerCol); Por:
matrix = (char **)malloc( sizeof(char *)*(bmp->width*bytesPerCol) );
ya estás buscando espacio en memoria para todos esos punteros a caracter, y no para todos esos caracteres. En mi máquina, sizeof(char*) me da 4, así que estaría alojando cuatro veces menos espacio que el necesario.
(Si eso no era... nos cuentas) - Ah, y si era, también, por favor)
Alejandro
//matrix = (char **)malloc(bmp->width*bytesPerCol); Por:
matrix = (char **)malloc( sizeof(char *)*(bmp->width*bytesPerCol) );
ya estás buscando espacio en memoria para todos esos punteros a caracter, y no para todos esos caracteres. En mi máquina, sizeof(char*) me da 4, así que estaría alojando cuatro veces menos espacio que el necesario.
(Si eso no era... nos cuentas) - Ah, y si era, también, por favor)
Alejandro
