Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Fabi0lo en 24 Noviembre 2012, 23:56 pm



Título: Duda, problema de asignacion con Malloc
Publicado por: Fabi0lo en 24 Noviembre 2012, 23:56 pm
Buenas, otra duda sencilla que no puedo responder, acá intentando asignar memoria a un arreglo de char y al parecer lo asigna mal, en que falla??

Tengo definida en una cabecera esta estructura que contiene un char
Código
  1. #ifndef ESTRUCTURA_H
  2. #define ESTRUCTURA_H
  3.  
  4. struct input{
  5. int prueba;
  6. char** mensaje; //habria que almacenarlo con malloc
  7. }str;
  8.  
  9. #endif

main.c
Código
  1. int i;
  2. str.mensaje = (char**)malloc(sizeof(char*)*72);
  3. for(i = 0; i<72; i++){ str.mensaje[i] = (char*)malloc(sizeof(char)*2048); }
  4.  
  5. printf("%d\n", sizeof(str.mensaje[2]));
Se supone que debería asignarse un tamaño 2048 para cada vector, pero en lugar de ello me imprime 8.

No se a que se debe este problema, alguien me podría aclarar en que me estoy equivocando??


Título: Re: Duda, problema de asignacion con Malloc
Publicado por: Ferno en 25 Noviembre 2012, 00:04 am
El error viene en el printf.

Al hacer sizeof(str.mensjae[2]) justamente te va a devolver el tamaño del tipo "char*" que es, en 64 bits, de tamaño 8 :D

Si queres ver si se asignó bien, bueno no se, copiá algo de 2047 caracteres en ese espacio. Si ves que no dio seg fault, es porque se asignó bien la memoria ^^


Título: Re: Duda, problema de asignacion con Malloc
Publicado por: Fabi0lo en 25 Noviembre 2012, 00:15 am
Lo he probado y solo puede ingresar textos de tamaño 8 en cada vector, por eso intenté imprimirel tamaño de cada vector y justamente indicaba 8, pero no cuadra, de donde salio ese 8 cuando le estoy especificando 2048. No se donde es que no cuadra


Título: Re: Duda, problema de asignacion con Malloc
Publicado por: Ferno en 25 Noviembre 2012, 00:22 am
El 8 es el tamaño de un puntero en tu arquitectura. Por eso ese printf ahí es correcto, pero no es correcta la forma de usarlo (no muestra lo que tu realmente quieres ver).

¿Podrías postear el code de cómo ingresaste los textos?


Título: Re: Duda, problema de asignacion con Malloc
Publicado por: Fabi0lo en 25 Noviembre 2012, 00:57 am
creo que ya encontré la pifia, entonces era el sizeof(str.mensaje[ i ]) ? quizás ahi agarre sentido, no se refiere al tamaño del vector en sí, si no as bien del puntero, tambien intenté cambiarlo por strlen(str.mensaje[ i ]), pero también se cae, nada mas queda poner el numero en duro 2048 xd

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "Lectura.h"
  4. #include "estructura.h"
  5.  
  6. extern struct input str;
  7.  
  8. void* lectura(void* inputFile){
  9.  
  10. char* linea = (char*)inputFile;
  11. FILE* archivo;
  12. char dir[20];
  13.  
  14. strcpy(dir, "textos/");
  15. strcat(dir, linea);
  16.  
  17. printf("\nDireccion del Texto es: /%s\n\n", dir);
  18.  
  19. int i;
  20. if((archivo = fopen(dir, "r")) != NULL){
  21. for(i = 0; !feof(archivo); i++){
  22. fgets(str.mensaje[i], sizeof(str.mensaje[i]), archivo);
  23. }
  24. }
  25. else{
  26. perror("error al abrir el fichero\n");
  27. return;
  28. }
  29. fclose(archivo);
  30. }

Una duda, entonces si quiero usar cada vector para modificarlo luego... como le hago referencia?


Título: Re: Duda, problema de asignacion con Malloc
Publicado por: Ferno en 25 Noviembre 2012, 01:50 am
Si pides memoria y automáticamente utilizas strlen(str.mensaje[ i ]); no deberías confiar en lo que se imprime, porque si no lo inicializaste ahí hay basura.

Para ver bien, pides memoria, le asignas algo a dicho vector. Algo como no se...

Código
  1. strcpy(str.mensaje[0],"Hola este es el primer mensaje del vector");

Y luego imprimes:

Código
  1. printf("%s\n",str.mensaje[0]);


Título: Re: Duda, problema de asignacion con Malloc
Publicado por: 0xDani en 25 Noviembre 2012, 18:31 pm
Simplemente cuando hubo algun error malloc() retorna NULL. Si el valor de retorno es distinto de NULL se asigno bien la memoria, y si aun asi quieres convencerte de que se ha reservado:

Código
  1. for(i=0; i<2048; i++)
  2. str.mensaje[0][i] = 'a';
  3. str.mensaje[0][2048] = '\0';
  4. printf("Size: %d", strlen(str.mensaje[0]));
  5.