Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problemas con asignar memoria a estructuras

Estas en el tema de Problemas con asignar memoria a estructuras en el foro de C/C++ en Foros del Web. Hola a todos. Tengo el siguiente problema. He definido una estructura en un fichero de la siguiente forma: #define MAX_FILES 100 typedef struct Transfer { ...
  #1 (permalink)  
Antiguo 17/12/2008, 06:53
 
Fecha de Ingreso: diciembre-2008
Mensajes: 5
Antigüedad: 15 años, 4 meses
Puntos: 0
Problemas con asignar memoria a estructuras

Hola a todos.

Tengo el siguiente problema. He definido una estructura en un fichero de la siguiente forma:

#define MAX_FILES 100

typedef struct Transfer {
char * fileNames;
int * operationsFiles;
}Transfer,*TransferPtr;
En el primer metodo

//Init the struc
TransferPtr tfr = (TransferPtr)calloc(1,sizeof(Transfer));
tfr->fileNames = (char *)calloc(MAX_FILES, sizeof(char));
tfr->operationsFiles = (char *)calloc(MAX_FILES, sizeof(char));
printf("[VALORES DE STRUCT]\n %p",tfr->operationFiles[0]);


El problema está en que hago lo siguiente:

int index = 0;
tfr->fileNames[index] = fileSource;
printf("[OPS] %s",fileSource); --> Imprime file_0000
tfr->operationsFiles[index] = 1;
printf("[OPF] %s",transfer->fileNames[index]); -->Devuelve SEGMENTATION_FAULT


No entiendo porque esta operación devuelve Segmentation Fault.¿Me podeis ayudar?

Muchas gracias
  #2 (permalink)  
Antiguo 17/12/2008, 08:03
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Problemas con asignar memoria a estructuras

¿Y que es transfer? No esta definida aca esa variable ... mejor pone la minima expresion de codigo compilable que genere la excepcion (SEGMENTATION_FAULT).
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 17/12/2008, 08:21
 
Fecha de Ingreso: diciembre-2008
Mensajes: 5
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Problemas con asignar memoria a estructuras

Perdon no es transfer, es tfr...

int index = 0;
tfr->fileNames[index] = fileSource;
printf("[OPS] %s",fileSource); --> Imprime file_0000
tfr->operationsFiles[index] = 1;
printf("[OPF] %s",tfr->fileNames[index]); -->Devuelve SEGMENTATION_FAULT
  #4 (permalink)  
Antiguo 17/12/2008, 08:42
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Problemas con asignar memoria a estructuras

¿Estas escribiendo el codigo? Por favor la proxima vez COPIALO y PEGALO (igual ese que dejaste no es codigo compilable).

fileNames tiene que ser DOBLE PUNTERO (char ** fileNames;) si queres tener un conjunto de cadenas y cuando reserves usa sizeof(char*) - la misma LOGICA aplica para operationsFiles si queres un conjunto: sizeof(int*) -.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO

Última edición por Eternal Idol; 17/12/2008 a las 08:59
  #5 (permalink)  
Antiguo 17/12/2008, 08:58
 
Fecha de Ingreso: diciembre-2008
Mensajes: 5
Antigüedad: 15 años, 4 meses
Puntos: 0
Mensaje Respuesta: Problemas con asignar memoria a estructuras

El problema de pegar todo el codigo es que lo tengo en varios ficheros y tendria que pegar varios ficheros.
Mi idea es tener una estructura que guarde nombres de ficheros y un entero asociado a cada nombre de fichero. En JAva seria muy facil tendria dos arrays

String arrayNombres [] = {"file1","file2","file3"};
String arrayNumeros [] ={0,1,2}

Mi problema esta en que al querer hacer esto en C como no tengo mucha idea de C, he pensado que se podia poner como

typedef struct transfer {
char * fileNames;
int * operationsFiles;
}TransferOperations,*TransferOperationsPtr;

Entonces si pongo char * fileNames, no representa un array de strings?
¿Y por qué si pongo int* si puedo almacenar informacion?

Es decir, la segunda instruccion si funciona pero la primera no.

transfer->fileNames[index] = fileSource;
transfer->operationsFiles[index] = 1;
  #6 (permalink)  
Antiguo 17/12/2008, 09:04
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Problemas con asignar memoria a estructuras

char *arrayNombres [] = {"file1","file2","file3"};

Ahi tendrias un array de cadenas.

Cuando accedes al elemento del array estas referenciando el puntero y por lo tanto lo que tenes en fileNames[index] es un solo caracter (char, un byte) y a un caracter no le podes asignar una cadena (char*) como fileSource que en definitiva es un puntero (4/8 bytes en x86/x64). En el otro caso no estas asignando un puntero sino un valor entero, seria equivalente si hicieras algo como por ejemplo:

Código:
transfer->fileNames[index] = 'C';
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #7 (permalink)  
Antiguo 17/12/2008, 12:17
 
Fecha de Ingreso: diciembre-2008
Mensajes: 5
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Problemas con asignar memoria a estructuras

Muchas gracias,

He solucionado este problema ya, ahora mi problema es cuando intento liberar la memoria reservada, que es cuando me está dando segmentation fault.

typedef struct TransferOperations {
char ** fileNames;
int * operationsFiles;
}TransferOperations,*TransferOperationsPtr;


//Init the struc
TransferOperationsPtr transfer = (TransferOperationsPtr)calloc(1,sizeof(TransferOpe rations));
transfer->fileNames = (char *)calloc(MAX_FILES, sizeof(char));
transfer->operationsFiles = (int *)calloc(MAX_FILES, sizeof(int));


free(transfer->fileNames);
free(transfer->operationsFiles);
free(transfer);


Cuando hago el free es cuando tengo el problema del Segmentation Fault.

¿Cual puede ser el problema?

Muchas gracias
  #8 (permalink)  
Antiguo 17/12/2008, 12:43
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Problemas con asignar memoria a estructuras

¿Te compila ese codigo?

Deberia ser:
Código:
transfer->fileNames = (char**)calloc(MAX_FILES, sizeof(char*));
Igual POR FAVOR si queres que lo depuremos para saber la causa del problema deja un codigo que se pueda compilar. No hace falta que incluya todo tu codigo ni mucho menos, simplemente lo minimo indispensable para que se produzca el error, con eso es suficiente.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #9 (permalink)  
Antiguo 18/12/2008, 04:24
 
Fecha de Ingreso: diciembre-2008
Mensajes: 5
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Problemas con asignar memoria a estructuras

¿Pero tengo una duda, y como harias para liberar esa memoria?


typedef struct TransferOperations {
char ** fileNames;
int * operationsFiles;
}TransferOperations,*TransferOperationsPtr;

//Init the struc
TransferOperationsPtr transfer = (TransferOperationsPtr)calloc(1,sizeof(TransferOpe rations));
transfer->fileNames = (char *)calloc(MAX_FILES, sizeof(char));
transfer->operationsFiles = (int *)calloc(MAX_FILES, sizeof(int));


void deleteOperations(TransferOperationsPtr operations) {

free(operations->fileNames);
free(operations->operationsFiles);
free(operations);
}


Al metodo deleteOperations se le llama con un puntero a la estructura y el problema está en que da error justo cuando intento liberar memoria.
Uno de los motivos puede ser porque no he asignado correctamente la estructura y el otro motivo puede ser porque no se libera correctamente asi.

Muchas gracias
  #10 (permalink)  
Antiguo 18/12/2008, 05:01
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Problemas con asignar memoria a estructuras

Ademas de los errores que imposibilitan compilar el poco codigo que dejaste no encuentro ninguna excepcion en tiempo de ejecucion.

Mi paciencia es muy escasa y no tengo intencion de seguir teniendo que hacer esto:

Código:
#include <windows.h>
#include <stdio.h>

#define MAX_FILES 100

typedef struct TransferOperations {
char ** fileNames;
int * operationsFiles;
}TransferOperations,*TransferOperationsPtr;

void deleteOperations(TransferOperationsPtr operations) {

free(operations->fileNames);
free(operations->operationsFiles);
free(operations);
}


int main()
{

//Init the struc
TransferOperationsPtr transfer = (TransferOperationsPtr)calloc(1,sizeof(TransferOperations));
transfer->fileNames = (char **)calloc(MAX_FILES, sizeof(char));
transfer->operationsFiles = (int *)calloc(MAX_FILES, sizeof(int));

deleteOperations(transfer);
  return 0;
}
Por favor si queres que yo continue intentando ayudarte: pega un codigo de ese estilo que tenga el problema.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:00.