elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con violación de segmento
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Problema con violación de segmento  (Leído 13,605 veces)
Triper0

Desconectado Desconectado

Mensajes: 38



Ver Perfil
Problema con violación de segmento
« en: 26 Julio 2011, 20:53 pm »

Bueno, mi problema es el siguiente:
Desde que empecé con C, el profesor me recomendó usar Linux.
El tema es que SIEMPRE que uso punteros, y toco la memoria, cuando compilo me sale "Violación de segmento"...

El profesor me dijo "El problema no es Linux, el problema es el programador" ¬¬

En fin, no encuentro ayuda, sé que estoy haciendo algo mal, pero no sé qué... Sé que Linux no te deja tocar la memoria como si lo hace Windows (el cual no me genera problema con esto)...

En fin, acá dejo un código que justo estaba haciendo hoy, es muy simple, compila excelente, pero dice el famoso "violación de segmento"...

Código:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct {
char *nombre;
char *apellido;
char *fecha;
char *legajo;
char *tipDoc;
int DNI;
}Alumno;

int main(){
Alumno alu,alu2;
malloc(sizeof(alu.nombre));
malloc(sizeof(alu.apellido));
malloc(sizeof(alu.fecha));
malloc(sizeof(alu.legajo));
malloc(sizeof(alu.tipDoc));
strcpy(alu.nombre,"Esteban");
strcpy(alu.apellido,"Gonzalez");
strcpy(alu.fecha,"02111991");
strcpy(alu.legajo,"10662/3");
strcpy(alu.tipDoc,"DNI");
alu.DNI=36363023;

malloc(sizeof(alu2.nombre));
malloc(sizeof(alu2.apellido));
malloc(sizeof(alu2.fecha));
malloc(sizeof(alu2.legajo));
malloc(sizeof(alu2.tipDoc));

alu2=alu;

printf("El nombre del alu es: %s, el de alu2 es: %s\n",alu.nombre,alu2.nombre);
printf("El apellido del alu es: %s, el de alu2 es: %s\n",alu.apellido,alu2.apellido);
printf("La fecha del alu es: %s, el de alu2 es: %s\n",alu.fecha,alu2.fecha);
printf("El legajo del alu es: %s, el de alu2 es: %s\n",alu.legajo,alu2.legajo);
printf("El tipo de documento del alu es: %s, el de alu2 es: %s\n",alu.tipDoc,alu2.tipDoc);
printf("El DNI del alu es: %d, el de alu2 es: %d\n\n\n",alu.DNI,alu2.DNI);

strcpy(alu.nombre,"Jose");

printf("El nombre del alu es: %s, el de alu2 es: %s\n",alu.nombre,alu2.nombre);
printf("El apellido del alu es: %s, el de alu2 es: %s\n",alu.apellido,alu2.apellido);
printf("La fecha del alu es: %s, el de alu2 es: %s\n",alu.fecha,alu2.fecha);
printf("El legajo del alu es: %s, el de alu2 es: %s\n",alu.legajo,alu2.legajo);
printf("El tipo de documento del alu es: %s, el de alu2 es: %s\n",alu.tipDoc,alu2.tipDoc);
printf("El DNI del alu es: %d, el de alu2 es: %d\n",alu.DNI,alu2.DNI);

return 0;
}


Gracias de antemano...


En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Problema con violación de segmento
« Respuesta #1 en: 26 Julio 2011, 21:13 pm »

Todas las líneas de malloc están mal, malloc es una función que devuelve un puntero a la memoria asignada, por lo cual deberías asignarlo a la variable que intentas asignarle espacio.


En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
satu


Desconectado Desconectado

Mensajes: 301

Siempre aprendiendo


Ver Perfil WWW
Re: Problema con violación de segmento
« Respuesta #2 en: 26 Julio 2011, 21:42 pm »

Hola

Además de que estás reservando el tamaño de un puntero

Saludos
En línea

Breakbeat como forma de vida
Triper0

Desconectado Desconectado

Mensajes: 38



Ver Perfil
Re: Problema con violación de segmento
« Respuesta #3 en: 26 Julio 2011, 21:45 pm »

Desde ya, MUCHÍSIMAS gracias, me ha vuelto loco durante todo el seminario este error... Ahora ya no me lo tira más, acá dejo el código modificado para que me digan si de la forma que lo solucioné está bien o es una falta de respeto a los ojos de un programador de C :P

Código:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct {
char *nombre;
char *apellido;
char *fecha;
char *legajo;
char *tipDoc;
int DNI;
}Alumno;

int main(){
Alumno alu,alu2;
alu.nombre= malloc(sizeof(alu.nombre));
alu.apellido= malloc(sizeof(alu.apellido));
alu.fecha= malloc(sizeof(alu.fecha));
alu.legajo= malloc(sizeof(alu.legajo));
alu.tipDoc= malloc(sizeof(alu.tipDoc));
strcpy(alu.nombre,"Esteban");
strcpy(alu.apellido,"Gonzalez");
strcpy(alu.fecha,"02111991");
strcpy(alu.legajo,"10662/3");
strcpy(alu.tipDoc,"DNI");
alu.DNI=36363023;

alu2.nombre= malloc(sizeof(alu2.nombre));
alu2.apellido= malloc(sizeof(alu2.apellido));
alu2.fecha= malloc(sizeof(alu2.fecha));
alu2.legajo= malloc(sizeof(alu2.legajo));
alu2.tipDoc= malloc(sizeof(alu2.tipDoc));

alu2=alu;

printf("El nombre del alu es: %s, el de alu2 es: %s\n",alu.nombre,alu2.nombre);
printf("El apellido del alu es: %s, el de alu2 es: %s\n",alu.apellido,alu2.apellido);
printf("La fecha del alu es: %s, el de alu2 es: %s\n",alu.fecha,alu2.fecha);
printf("El legajo del alu es: %s, el de alu2 es: %s\n",alu.legajo,alu2.legajo);
printf("El tipo de documento del alu es: %s, el de alu2 es: %s\n",alu.tipDoc,alu2.tipDoc);
printf("El DNI del alu es: %d, el de alu2 es: %d\n\n\n",alu.DNI,alu2.DNI);

strcpy(alu.nombre,"Jose");

printf("El nombre del alu es: %s, el de alu2 es: %s\n",alu.nombre,alu2.nombre);
printf("El apellido del alu es: %s, el de alu2 es: %s\n",alu.apellido,alu2.apellido);
printf("La fecha del alu es: %s, el de alu2 es: %s\n",alu.fecha,alu2.fecha);
printf("El legajo del alu es: %s, el de alu2 es: %s\n",alu.legajo,alu2.legajo);
printf("El tipo de documento del alu es: %s, el de alu2 es: %s\n",alu.tipDoc,alu2.tipDoc);
printf("El DNI del alu es: %d, el de alu2 es: %d\n",alu.DNI,alu2.DNI);

return 0;
}
En línea

Dark Invader

Desconectado Desconectado

Mensajes: 111


Lucha hasta el final para conseguir tu objetivo.


Ver Perfil
Re: Problema con violación de segmento
« Respuesta #4 en: 26 Julio 2011, 22:03 pm »

Ahora estaría bien,te faltaba el cast:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. typedef struct {
  6. char *nombre;
  7. char *apellido;
  8. char *fecha;
  9. char *legajo;
  10. char *tipDoc;
  11. int DNI;
  12. }Alumno;
  13.  
  14. int main(){
  15. Alumno alu,alu2;
  16. alu.nombre= (char *)malloc(sizeof(alu.nombre));
  17. alu.apellido= (char *)malloc(sizeof(alu.apellido));
  18. alu.fecha= (char *)malloc(sizeof(alu.fecha));
  19. alu.legajo= (char *)malloc(sizeof(alu.legajo));
  20. alu.tipDoc= (char *)malloc(sizeof(alu.tipDoc));
  21. strcpy(alu.nombre,"Esteban");
  22. strcpy(alu.apellido,"Gonzalez");
  23. strcpy(alu.fecha,"02111991");
  24. strcpy(alu.legajo,"10662/3");
  25. strcpy(alu.tipDoc,"DNI");
  26. alu.DNI=36363023;
  27.  
  28. alu2.nombre= (char*) malloc(sizeof(alu2.nombre));
  29. alu2.apellido= (char*)malloc(sizeof(alu2.apellido));
  30. alu2.fecha= (char *)malloc(sizeof(alu2.fecha));
  31. alu2.legajo= (char*)malloc(sizeof(alu2.legajo));
  32. alu2.tipDoc= (char*)malloc(sizeof(alu2.tipDoc));
  33.  
  34. alu2=alu;
  35.  
  36. printf("El nombre del alu es: %s, el de alu2 es: %s\n",alu.nombre,alu2.nombre);
  37. printf("El apellido del alu es: %s, el de alu2 es: %s\n",alu.apellido,alu2.apellido);
  38. printf("La fecha del alu es: %s, el de alu2 es: %s\n",alu.fecha,alu2.fecha);
  39. printf("El legajo del alu es: %s, el de alu2 es: %s\n",alu.legajo,alu2.legajo);
  40. printf("El tipo de documento del alu es: %s, el de alu2 es: %s\n",alu.tipDoc,alu2.tipDoc);
  41. printf("El DNI del alu es: %d, el de alu2 es: %d\n\n\n",alu.DNI,alu2.DNI);
  42.  
  43. strcpy(alu.nombre,"Jose");
  44.  
  45. printf("El nombre del alu es: %s, el de alu2 es: %s\n",alu.nombre,alu2.nombre);
  46. printf("El apellido del alu es: %s, el de alu2 es: %s\n",alu.apellido,alu2.apellido);
  47. printf("La fecha del alu es: %s, el de alu2 es: %s\n",alu.fecha,alu2.fecha);
  48. printf("El legajo del alu es: %s, el de alu2 es: %s\n",alu.legajo,alu2.legajo);
  49. printf("El tipo de documento del alu es: %s, el de alu2 es: %s\n",alu.tipDoc,alu2.tipDoc);
  50. printf("El DNI del alu es: %d, el de alu2 es: %d\n",alu.DNI,alu2.DNI);
  51.  
  52. return 0;
  53. }

Por cierto,una sugerencia,yo la fecha la pondria como int mas que como char... :rolleyes:

Un saludo
En línea

Triper0

Desconectado Desconectado

Mensajes: 38



Ver Perfil
Re: Problema con violación de segmento
« Respuesta #5 en: 26 Julio 2011, 22:08 pm »

Gracias, gracias y nuevamente MIL gracias...

Con el tema de la fecha... Cuando lo pongo en int, long int o cualquier int que se me ocurra me tira el siguiente error de compilación:

Citar
error: invalid digit "9" in octal constant

Me suena rarisimo, no sé porqué dice que es octal, porque nada que ver... Por eso lo hice como cadena :P
En línea

naderST


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Re: Problema con violación de segmento
« Respuesta #6 en: 26 Julio 2011, 22:14 pm »

La fecha déjala char* porque como piensas asignar 26/07/11 en un int? lo de octal es porque si le asignas a un int esto 09 el tomará el numero como octal y los números octales no incluyen el 9 (0-7).
En línea

Triper0

Desconectado Desconectado

Mensajes: 38



Ver Perfil
Re: Problema con violación de segmento
« Respuesta #7 en: 26 Julio 2011, 22:20 pm »

Claro, vos decís que el error de octal me lo toma por el primer '0' del número?...
Claro, no lo pensé a eso...

De todas formas si, el hecho de las '/' es importante, aunque no hice una cadena muy grande como para que entren, jaja...
Igual son ejercicios pavos que estoy re/haciendo porque rindo un parcial y empecé de 0, jaja... Hay muchas cosas que las tenía bastante oxidadas :P

Ya de paso hago otra consulta:
Por ejemplo, yo definí una macro, supongamos:

#define T_INT 1;

si yo después, a esa macro la quiero comparar con una variable de tipo int también, que previamente fue ingresado su valor por teclado, ¿cómo se haría?...
Porque yo hice

if (valor == T_INT)
  printf("te imprimo algo");

y me tira error : error: expected ‘)’ before ‘;’ token

Código:
#define T_INT 1;
#define T_FLOAT 2;
#define T_STR 3;

union T_union{
int ival;
float fval;
char *sval;
};

int main(){
int valor;
union T_union u;
u.ival=22;
u.fval=22.69;
u.sval=(char *)malloc(sizeof(u.sval));
strcpy(u.sval,"NO ME LEAS");

printf("Ingrese un valor para invocar la lectura:\t");
scanf("%d\n",&valor);

if (valor == T_INT)
printf("El valor de ival es: %d\n",u.ival);
if (valor == T_FLOAT)
printf("El valor de fval es: %f\n",u.fval);
if (valor == T_STR)
printf("El contenido de sval es: %s\n",u.sval);

return 0;
}

Ahí dejé el código para complicar menos las cosas...
« Última modificación: 26 Julio 2011, 22:24 pm por Triper0 » En línea

Dark Invader

Desconectado Desconectado

Mensajes: 111


Lucha hasta el final para conseguir tu objetivo.


Ver Perfil
Re: Problema con violación de segmento
« Respuesta #8 en: 26 Julio 2011, 22:22 pm »

Edito:ya lo explico el compañero naderST  :P

De todos modos eso seria todo segun veo,si quieres puedes utilizar al operador new para asignar memoria,es de C++ pero es mas simple de asignar,aunque claro si el profe te dice que uses C yo no voy a decir lo contrario,asique dejaria el code asi si nadie tiene algo que añadir.

PD:Asignar la fecha como int a --->26072011,queda mas chapuzas pero bueno...Ademas no lo he probado,lo estoy diciendo por intuicion mas que otra cosa...xD

Un saludo
En línea

Triper0

Desconectado Desconectado

Mensajes: 38



Ver Perfil
Re: Problema con violación de segmento
« Respuesta #9 en: 26 Julio 2011, 22:26 pm »

Si, es un seminario de lenguaje C, no nos permiten ni C++ ni C#.
Es más, nos hicieron hacer un trabajo final de manejos de .BMP y nos hicieron hacer todo por nuestra cuenta, nada de usar funciones predefinidas de BMP ni nada, todo manual...
Aprendí bastante, pero fue un dolor de cabeza importante, jaja...
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
calculadora en lenguaje ensamblador ¨violacion de segmento¨
ASM
larapam 2 4,592 Último mensaje 12 Mayo 2012, 18:58 pm
por CasiqueCasimiro
Violacion de segmento en producto de matrices
Programación C/C++
forakas 2 2,328 Último mensaje 28 Diciembre 2012, 04:53 am
por durasno
problema con una violacion de segmento usando opcodes « 1 2 »
Programación C/C++
Belial & Grimoire 10 4,825 Último mensaje 2 Septiembre 2013, 11:02 am
por Eternal Idol
ayuda violacion de segmento?
Programación General
nightcode 7 2,545 Último mensaje 31 Diciembre 2013, 18:32 pm
por nightcode
Violación de Segmento
Programación C/C++
Jaquieline_JJ 1 1,062 Último mensaje 24 Abril 2014, 04:11 am
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines