C-Code stürzt ab

Hallo,
ich habe folgendes Problem.
(Hab den Post editiert und jetz vereinfacht!)

Code:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>


int isNum(char *s){
    return sscanf(s,"%d");
}

void test(char *s){
     if(isNum(s))
         printf("isNum\n");
     else
         printf("noNum\n");    
}

int main(void){
    char *s = "3";
    if(isNum(s)){
        printf("isNum\n");
    }else{
        printf("noNum\n");
    }
    test(s);
    getch();
}
Wieso funktioniert der aufruf der Prozedur isNum() in der main perfekt, in der prozedur test(char *s) aber nicht. Sie verursacht dor dass das Programm abstürzt!
hab keinen blassen schimmer

Diese Prozedur ist zwar total blöd, ich weis, aber ich brauche sie bei einem Projekt!
Danke vielmals für eure Hilfe!

kito
 
@Ar-ras
Genial!! :D
Ich habs jetz in den größeren Teil-code eingebaut....und siehe da: es funkt :D
Sobald ich Zeit habe werde ich es komplett ins Programm integrieren...ist eine Teilfunktion einer Symboltabelle eines kleinen Interpreters (Projekt in UNI).
Aber diese Prozedur isNum() hat mich noch in den Wahnsinn getrieben. Wieso das jetzt aber funktioniert habe ich noch nicht kapiert. Der Parameter "n" ist ja total umsonst da ?(
Und wia meinst du das:
(um was zu returnen, braucht man auch daten... psst nicht weitersagen ;) )

Danke, Kito
 
ok, mir das gleich mit Ollydbg anzuschaun is mir nicht in den Sinn gekommen :D...da auch meine assembly-kenntnisse nicht derartig weit reichen :rolleyes:

Wie gesagt, es funktioniert und das ist gut =)

Danke dir vielmals!!
kito
 
Dein Aufruf sieht so aus:
sscanf(s,"%d");

Der Fehler ist, dass du mit s den Eingangsdatenstrom angibst, also der aus dem die Daten ausgelesen werden sollen und mit dem "%d" sagst du der Funktion, dass die Eingabe in einen Dezimal-Wert umgewandelt werden soll. Was fehlt ist ein Platz an den sscanf das Ergebnis ( die Dezimalzahl) hinschreiben kann. Weil da aber nichts steht nimmt sich die Funktion den nächsten Wert vom Stack und tut so als wäre das die Adresse an die das Ergebnis geschrieben werden sollte.
Das Ergebnis ist, das dein Stackframe zerstört wird und er beim zurückkehren abstürzt.

Korrekt wäre ( wie von Ar-ras vorgeschlagen):
int n;
sscanf(s,"%d",&n);

Das meinte er wahrscheinlich auch mit dem Rückgabewert.
 
ach so...jetzt verstehe ich..
Hätte mir die manuals für sscanf() besser anschauen sollen!

Danke, interessant zu wissen
kito
 
Zurück
Oben