Duda, problema de asignacion con Malloc

Iniciado por Fabi0lo, 24 Noviembre 2012, 23:56 PM

0 Miembros y 1 Visitante están viendo este tema.

Fabi0lo

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#ifndef ESTRUCTURA_H
#define ESTRUCTURA_H

struct input{
int prueba;
char** mensaje; //habria que almacenarlo con malloc
}str;

#endif


main.c int i;
str.mensaje = (char**)malloc(sizeof(char*)*72);
for(i = 0; i<72; i++){ str.mensaje[i] = (char*)malloc(sizeof(char)*2048); }

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??

Ferno

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 ^^

Fabi0lo

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

Ferno

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?

Fabi0lo

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

#include <stdio.h>
#include <string.h>
#include "Lectura.h"
#include "estructura.h"

extern struct input str;

void* lectura(void* inputFile){

char* linea = (char*)inputFile;
FILE* archivo;
char dir[20];

strcpy(dir, "textos/");
strcat(dir, linea);

printf("\nDireccion del Texto es: /%s\n\n", dir);

int i;
if((archivo = fopen(dir, "r")) != NULL){
for(i = 0; !feof(archivo); i++){
fgets(str.mensaje[i], sizeof(str.mensaje[i]), archivo);
}
}
else{
perror("error al abrir el fichero\n");
return;
}
fclose(archivo);
}


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

Ferno

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...

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

Y luego imprimes:

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

0xDani

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:


for(i=0; i<2048; i++)
str.mensaje[0][i] = 'a';
str.mensaje[0][2048] = '\0';
printf("Size: %d", strlen(str.mensaje[0]));
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM