Foros del Web » Programación para mayores de 30 ;) » Programación General »

Segmentation fault en cada compilacion

Estas en el tema de Segmentation fault en cada compilacion en el foro de Programación General en Foros del Web. Eso mismo, cada vez que compilo algo, por simple que sea, obtengo eso. Aclaro, estoy usando fedora core 3 con gcc (GCC) 3.4.3 20050227 (Red ...
  #1 (permalink)  
Antiguo 26/04/2005, 18:26
Avatar de lord_zoo  
Fecha de Ingreso: febrero-2005
Ubicación: Buenos Aires
Mensajes: 104
Antigüedad: 19 años, 9 meses
Puntos: 2
Segmentation fault en cada compilacion

Eso mismo, cada vez que compilo algo, por simple que sea, obtengo eso.

Aclaro, estoy usando fedora core 3 con gcc (GCC) 3.4.3 20050227 (Red Hat 3.4.3-22.fc3)

Les paso un ejemplo muy simple de codigo que tira error.

#include <stdio.h>

int main(){
char archi;
FILE *fp;
archi = "file.txt";
if ( (fp = fopen(archi,"w")) != NULL){
fputs("Hola mundo\n",fp);
}
fclose(fp);
}

No termino de compilar esto que cuando lo quiero ejecutar tira Segmentation fault.

Alguna idea que puede ser? ya que me corta totalmente para aprender a programar en c. :(

Gracias adelantadas.
  #2 (permalink)  
Antiguo 26/04/2005, 18:42
 
Fecha de Ingreso: diciembre-2002
Mensajes: 23
Antigüedad: 21 años, 11 meses
Puntos: 0
Para que el programa funcione tienes que declarar la variable 'archi' como tipo char *

Un saludo
  #3 (permalink)  
Antiguo 26/04/2005, 23:30
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 7 meses
Puntos: 17
Tienes que declarar un array de chars para contener el nombre de la lonigtud de éste + 1 (char []), o un "char *" y a continuación reservar la memoria dinámicamente. Por otra parte, no puedes asignar cadenas enteras, debes usar la función strccpy.

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

int main()
{
	char archi[100];
	FILE *fp;

	strcpy(archi,"file.txt");

	if ( (fp = fopen(archi,"w")) != NULL)
	{
		fputs("Hola mundo\n",fp);
		fclose(fp);
	}
}
  #4 (permalink)  
Antiguo 27/04/2005, 03:19
 
Fecha de Ingreso: diciembre-2002
Mensajes: 23
Antigüedad: 21 años, 11 meses
Puntos: 0
Cita:
Iniciado por Eternal Idol
Asi no funciona ni por casualidad.
Tanto mi compilador (Lcc-win32) como Splint no emitieron ningun mensaje de error/advertencia y el programa se compila y ejecuta correctamente, asi que por lo menos funciona por casualidad.

Cita:
Iniciado por Eternal Idol
No solo no se puede asignar una cadena asi como asi (para eso estan las funciones de cadenas de C)
Estas en lo correcto pero lo que yo indique en el mensaje anterior no es una asignacion de cadena, inicializar un puntero utilizando una literal de cadena es perfectamente valido:
Código:
char *pac;
pac = "Hola, mundo"; /* valido */

char array[100];
array = "Hola, mundo"; /* invalido */
Cita:
Iniciado por Eternal Idol
sino que el buffer estaria apuntando a cualquier lado
En el caso que mencione unas cuantas lineas arriba la variable 'pac' tiene como valor la direccion de memoria del primer caracter de la literal "Hola, mundo". Lo mismo se aplica a la variable 'archi' del programa original.

Un saludo
  #5 (permalink)  
Antiguo 27/04/2005, 03:32
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Mi mensaje ya no estaba y de cualquier manera asi lo unico que logras es confundir, especialmente a alguien que esta empezando con punteros.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #6 (permalink)  
Antiguo 27/04/2005, 04:06
 
Fecha de Ingreso: diciembre-2002
Mensajes: 23
Antigüedad: 21 años, 11 meses
Puntos: 0
Cita:
Iniciado por Eternal Idol
Mi mensaje ya no estaba
Tu mensaje estaba en el foro en el momento en el que estaba componiendo mi mensaje y es por eso que lo envie, por supuesto que si me hubiera dado cuenta que tu mensaje habia sido eliminado no lo envio.

Cita:
Iniciado por Eternal Idol
y de cualquier manera asi lo unico que logras es confundir, especialmente a alguien que esta empezando con punteros.
Mi unica intencion fue aclarar una diferencia que hay entre punteros y arrays.

Un saludo
  #7 (permalink)  
Antiguo 27/04/2005, 10:29
Avatar de lord_zoo  
Fecha de Ingreso: febrero-2005
Ubicación: Buenos Aires
Mensajes: 104
Antigüedad: 19 años, 9 meses
Puntos: 2
Bueno, definitivamente poniento a archiv como puntero se solucionaba perfectamente el problema.

Realmente me confunde un poco esto, ya que en los ejemplos que vi, no estaba de esta manera, ni tampoco como un arreglo. Asi que una de dos cosas, o el ejemplo estaba mal redactado o es muy viejo y algo en C cambio. :D

Igual, mil gracias, aunque ahora no se si siempre que use un char, aunque despues lo inicialice con una cadena estatica tenga que hacerlo como puntero.
Pero ahora estoy un poco mas sabio y eso me va a ayudar.

Gracias de nuevo.

Saludos.
  #8 (permalink)  
Antiguo 27/04/2005, 12:00
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 7 meses
Puntos: 17
Cita:
Iniciado por lord_zoo
Bueno, definitivamente poniento a archiv como puntero se solucionaba perfectamente el problema.

Realmente me confunde un poco esto, ya que en los ejemplos que vi, no estaba de esta manera, ni tampoco como un arreglo. Asi que una de dos cosas, o el ejemplo estaba mal redactado o es muy viejo y algo en C cambio. :D

Igual, mil gracias, aunque ahora no se si siempre que use un char, aunque despues lo inicialice con una cadena estatica tenga que hacerlo como puntero.
Pero ahora estoy un poco mas sabio y eso me va a ayudar.

Gracias de nuevo.

Saludos.
Un char equivale a un byte... Nada más que un byte. Y un puntero a char es una dirección a un byte... O a más. Para almacenar cadenas (las que sean) debes usar arrays (_no_ arreglos) o punteros.

Acostúmbrate a usar strcpy. Porque parece ser que te leo como diciendo "voy a usar siempre el operador de asignación (=)", y si lo haces vas a obtener resultados que te parecerán extraños. Por ejemplo, tenemos:

Código:
char * a;
char * b;

a = "Hola";
b = a;
Después de ese código pensarás que a contiene "Hola" y b contiene "Hola". No es cierto. Los punteros no "contienen". Los punteros apuntan. Por esa razón a apunta a una dirección que pone "Hola" y b a esa misma. Si tú cambias 'a' por "Adios", b como apunta al mismo sitio, también será "Adios". Y viceversa.

Si usas strcpy te aseguras de que estás copiando la cadena, no la dirección. Eso sí, con strcpy debes tener un array (que ya tiene memoria asignada) o asignarla tú dinámicamente.

Lo de la versión o fabricante del compilador da =, ejemplos tan simples no dependen de eso... a menos que sea uno extraño no compatible con ANSI-C.
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:29.