Bienvenido(a), Visitante. Favor de ingresar o registrarse.
Diciembre 02, 2008, 01:19:27
Inicio Ayuda Buscar Ingresar Registrarse
Noticias: Foro de Java, C++ y más.

Empieza una nueva comunidad de programación: Oneble ... es lo que tu quieras que sea

+  Foros Java y C/Linux
|-+  Programación
| |-+  C/C++ linux
| | |-+  Strcpy y Segmentation Fault
« anterior próximo »
Páginas: [1] Enviar tema Imprimir
Autor Tema: Strcpy y Segmentation Fault  (Leído 246 veces)
exiliado
Newbie
*
Mensajes: 7


Ver Perfil


« en: Agosto 06, 2008, 08:28:23 »

La otra duda Lengua

Tengo la siguiente estructura:
typedef struct
{
  /*! Datum's name */
  char* name;
..
..
  /*! Datum's pointer */
  void* ptr;
..
} DSC_DataInfo_struct;

Basicamente el funcionamiento es, para un receptor... poniendo en name el nombre de un parametro contenido en los mensajes recibidos, hay un comando Find, y si el parametro se encuentra definido, carga la estructura con todos sus parametros, y el puntero apunta al ultimo valor actualizado.

Entonces, lo que yo tengo es una funcion:

int Get/SetParametro(const char* nombre, void* parametro){
 DSC_DataInfo_struct estructura;

strcpy(estructura.name, nombre);
estado = Find(&estructura);
if (estado == 0){
   size = CalculaSizeParametro(estructura.ptr);
   memcpy(estructura.ptr, parametro, size);
   return 0;
}else return 1;

Entonces haciendo la llamada "SetParametro("nombreparametro",&parametro)" me deberia poner en parametro el valor actualizado.

Para ponerte en situacion, antes tenia esta funcion mal definida, pasandole el parametro "nombre" como "char*" y no como "const char*". En vez de poner Strcpy, directamente decia "estructura.name = nombre". Me daba warnings en la compilacion, pero funcionaba.

Ahora, como const char* no me da warnings en la compilacion, pero al llamarla, me da un Segmentation Fault en el strcpy....

Y no se solucionarlo.
En línea
chuidiang
Administrator
Hero Member
*****
Mensajes: 1974



Ver Perfil WWW Email
« Respuesta #1 en: Agosto 06, 2008, 09:44:07 »

Hola:

El strcpy() necesita que el sitio donde va a guardar la cadena tenga espacio de memoria reservado. Si declaras un puntero, ese puntero no tiene espacio de memoria, por lo que algo como esto

Código:
char *p;
strcpy (p, "hola");

dará problemas seguro, estilo segmentation fault. Para solucionarlo, debes dejar bastante espacio antes de hacer el strcpy

Código:
char *p = new char[5];  // al menos 5 caracteres, las cuatro letras de hola y el \0 del final
strcpy (p,"hola");

En tu caso tienes el mismo problema, solo que el puntero son los campos de la estructura.

Se bueno.
En línea

exiliado
Newbie
*
Mensajes: 7


Ver Perfil
« Respuesta #2 en: Agosto 06, 2008, 12:42:54 »

Muchas gracias,

he encontrado dos soluciones... no se cual es mejor:

1) dentro de la funcion definir:
char name_temp[tamaño fijo sobredimensionado];

strcpy(nametemp, nombre);
estructura.name = name_temp;

2) esctructura.name = malloc(8*sizeof(nombre)+1);
strcpy(estructura.name, nombre);
FIND
Obtener Parametro
...
free(esctructura.name);
estructura.name = NULL;

cual de las dos me recomiendas??

Muchas gracias!!
En línea
chuidiang
Administrator
Hero Member
*****
Mensajes: 1974



Ver Perfil WWW Email
« Respuesta #3 en: Agosto 07, 2008, 09:34:19 »

Hola:

El primero puede valer pero tiene dos pegas. La primera es que debes declarar un array por cada estructura que necesites, es decir, si solo vas a tener una variable de la estructura va bien, pero si tienes varias variables, necesitarás un array distinto por cada una de las variables. En caso contrario, el array es compartido por todas y sólo puede contener un nombre común para todos.

La segunda pega es que ese array no puede ser una variable local a una función o método. Si lo haces así, cuando termine la función o método, desaparece la variable local y el array, por lo que la estructura deja de apuntar a un sitio válido.

Por tanto, para un caso general, es mejor la segunda opción. Cada estructura tendrá su propia zona de memoria y si además, sabes el tamaño justo en el momento de hacer el malloc(), puedes reservar el tamaño justo, ahorrando memoria.

Se bueno.
En línea

Páginas: [1] Enviar tema Imprimir 
« anterior próximo »
Ir a:  


Ingresar con nombre de usuario, contraseña y duración de la sesión

Powered by MySQL Powered by PHP Powered by SMF 1.1.5 | SMF © 2006-2007, Simple Machines LLC XHTML 1.0 válido! CSS válido!