Error de segmentacion

Tengo el siguiente codigo programado en c:

#include
#include
#include "constants.h"

int
main (int argc, char *argv[])
{
char buffer[256];
int *numero = 0;
char * entrada = argv[1];
int resultat;
if (argc == 2)
{
resultat = string_a_enter (entrada, numero);
if (resultat == 0)
{
sprintf (buffer, "Cadena de caracters original = %s, valor = %d \n",
entrada, numero);
}
else
{
sprintf (buffer, "La cadena conte errors \n");
}
write (1, buffer, strlen (buffer));
}
else
{
sprintf (buffer, "Error en la entrada de parametres \n");
write (1, buffer, strlen (buffer));
}

}


int
string_a_enter (char *cadena, int *numero)
{
int i = 0;
int final = FALSE;
int negatiu = FALSE;
int retorno = -1;

while (!final)
{
if (cadena[i] == '\0'){
final = TRUE;
}
else
{
*numero = *numero * 10 + (cadena[i] - '0');
i++;
}
}
return (retorno);
}

y no entiendo porque al compilarlo me da un error de segmentacion. Lo he estado revisando y las posiciones recorridas del vector son correctas. La funcion string_a_enter no esta completa pero tiene lo necesario para funcionar y sin solucionar este problema no puedo continuar. A ver si alguien me puede hechar una mano
¿ Por qué diablos haceis tan dificil el ayudaros ?

1) Pegas un código sin comentarios
2) Pegas un código sin identar
3) Pegas un código escrito en un idioma que no entiendo
4) Ni si quiera te has preocupado de usar un debugger.

De todos modos, para que luego no me digan.... aquí tienes tu respuesta:

El problema es que estás dereferenciando un puntero nulo.
main:
    int *numero = 0;
    resultat = string_a_enter (entrada, numero);
string_a_enter:
    *numero = *numero * 10 + (cadena[i] - '0');


Ahí numero vale 0 (es decir NULL). De ahí el segfault.

- ferdy

PD: Estás haciendo un huevo de cosas mal para el poco código que has pegado... échale un doble vistazo con un buen libro de C a mano.
Gracias, por la ayuda y siento que el codigo este en tan mal estado, la proxima vez intentare hacer lo que me dices; comentarlo y estructurarlo mejor. Si no se sabe mal me podrias indicar mas o menos donde estan los errores tan grabes que te dices, ya que acabo de empezar y no tengo mucha idea. Gracias.

PD: Conoces algun libro bueno para aprender a programar en c???
- El código usa strlen(buffer) cuando buffer puede no estar inicializado.
- Usas sprintf así que el buffer se puede desbordar, o no acabar en '\0'
- No entiendo por qué usas write para imprimir por pantalla.
- Que yo sepa (no estoy 100% seguro) TRUE y FALSE no son parte de C.
- Creo que quieres usar 'atoi' en lugar de tu función a mano :)

Como libro, siempre recomiendo 'The C Programming Language 2E - Brian Kernighan & Dennis Ritchie', es genial si ya sabes programar.

- ferdy
Muchas gracias ferdy por todo, me anoto cosas lo que me dices. Efectivamente lo que quiero hacer es la funcion atoi, manualmente; esto lo he descubierto leyendome un manual de c. Respecto a lo de TRUE y FALSE, estas en lo cierto en c no estan declaradas, por ello las declaro en constants.h. Respecto al write no tengo ni idea porque lo hago asi, esto es parte de un ejercicio que tenia que hacer utilizando codigo. Me quedo con los posibles errores que me has dicho que me pueden dar. Gracias por todo.
Ferdy escribió:- El código usa strlen(buffer) cuando buffer puede no estar inicializado.
- Usas sprintf así que el buffer se puede desbordar, o no acabar en '\0'
- No entiendo por qué usas write para imprimir por pantalla.
- Que yo sepa (no estoy 100% seguro) TRUE y FALSE no son parte de C.
- Creo que quieres usar 'atoi' en lugar de tu función a mano :)

Como libro, siempre recomiendo 'The C Programming Language 2E - Brian Kernighan & Dennis Ritchie', es genial si ya sabes programar.

- ferdy


Mira al cesar lo que es del cesar... Igual que me parece que a veces en algunos comentarios no estas muy acertado en las formas (por supuesto IMO), mejor respuesta que esta no se puede dar....
Sip, Ferdy puede ser un poco (bastante) borde, pero hay que reconocerle que de C sabe un huevo y parte de otro, aparte que sus aportaciones suelen ser de bastante calidad (cuando no son fustigar a un troll, claro :D )
6 respuestas