2010-12-05 23 views
0

Ich programmiere eine Feedback-Schleife, die Benutzerbefehle aufnimmt und die Argumente basierend auf dem empfangenen Befehl verarbeitet. Bisher meine Funktion sieht wie folgt aus:C Segmentierungsfehler beim Zugriff auf einen Char-Array-Index

//main loop of the program that keeps repeating, which each cycle taking in one user input 
void mainLoop(){ 

char input[100]; // initial command 
char reg[2]; // registers R1-R7 and PC 
char value[20]; // register value 
char breakStatus[20]; // can be either "set" or clear" 
char breakAddress[80]; // address of break point in hex 


//Retrieve user input 
printf("Enter a command: "); 
scanf("%s", &input); 

//Process user input: 

//set (completed) 
if(strcasecmp(input, "set") == 0){ 
    scanf("%s", &reg); 
    scanf("%s", &value);  
    set(reg, value); 
    printf("register value is %s\n", value); 
    printf("value[0] is %x\n", value[0]); 
    //printf("Setting %s to %s!\n", reg, value); 
} 

//break (something's wrong here) 
else if(strcasecmp(input, "break") == 0){ 
    scanf("%s", &breakStatus); 
    scanf("%s", &breakAddress); 

    printf("breakStatus is %s\n", breakStatus); 
    printf("breakStatus[0] is %c\n", breakStatus[0]); 
    //printf("%sing break point at address %s\n", breakStatus, breakAddress); 
    executeBreak(breakStatus, breakAddress); 

} 


//error (completed) 
else 
    printf("Error: %s is not a valid command.\n", input); 

} 

Mein Problem ist, dass wenn ich versuche breakAddress zugreifen [index], ich einen Segmentation Fault bekommen. Wenn ich printf-ing breakStatus und breakAddress versuchte, haben beide die erwarteten Werte (ein Eingabebeispiel wäre break set x0001, wobei breakStatus = "set" und breakAddress = "x0001").

Ich weiß, dass, wenn ich den Bezeichner zu% c oder printf verwenden ("breakStatus [0] ist% c \ n", breakStatus [0]);, gibt es einen gültigen Wert zurück. Ich übergebe jedoch breakStatus und breakAddress in eine andere Funktion, und in dieser Funktion überprüfe ich, ob breakAddress [0] == 'x', zu dem ich sofort einen Segmentierungsfehler erhalte.

Ich bin mir nicht sicher, wie ich damit umgehen soll. Ich habe versucht, BreakAdresse [0] zu einem Char zu werfen und ich bekomme immer noch den gleichen Fehler.

Was mich wirklich verwirrt, ist, dass ich meinen Set-Teil genau so codiert habe (selbe char [] Initialisierung, selbe scanf-Prozedur) und wenn ich versuchte, einen Index von einer der Variablen abzurufen, funktioniert es einwandfrei.

Im Folgenden sind Teile meines set() und executeBreak() Funktionen als Referenz:

void set(char* reg, char* val){ 
    if(val[0] == 'x'){ // no segmentation fault 
    sscanf(val+1, "%x", &registers[r]); 
} 

void executeBreak(char* stat, char* add){ 
    if(!(add[0] == 'x')){ // segmentation fault here (tried casting as char also) 
    printf("Error: invalid break address"); 
    return; 
    } 
} 

Wenn jemand könnte einen Einblick bieten, warum ich einen Segmentation Fault in einer Funktion und keiner in der immer anderen würde es sehr geschätzt werden.

BEARBEITEN: Wurde% s in meiner printf-Anweisung los, da das nicht wirklich mein Problem ist. Idealerweise würde ich gerne wissen, warum val [0] in einer Funktion arbeitet und [0] nicht hinzufügt, da sie die gleichen Arten von Argumenten erhalten.

+2

void main() ist schlecht, ok? – Puppy

+0

Sie überprüfen oder erzwingen keine Stringlängen. Dies könnte sehr leicht wackeln, wenn der Text nicht korrekt formatiert ist. – Jay

+0

@DeadMG: das ist kein 'void main()'. –

Antwort

3

Beachten Sie die Warnungen des Compilers! :)

Sie haben char breakStatus[20]; definiert, d. H. Ein Array von Zeichen. Dann haben Sie in der printf-Anweisung printf("...%s...", breakStatus[0]);.

Der Formatierungscode 10 erwartet einen Zeiger auf eine Zeichenfolge. breakStatus [0] ist jedoch ein char-Wert. Der Compiler warnt Sie, was er tut, um das zu beheben: Er verwandelt den char-Wert in einen char * -Zeiger (char-Wert = 0 => Zeigeradresse ist 0). Angenommen, der Zeichenwert ist Null, dann verwandelt sich das Ganze auf magische Weise in einen Nullzeiger. Der Versuch, einen NULL-Zeiger (oder einen 0xff-Zeiger, vielleicht ... der Wert ist im Wesentlichen zufällig) zu dereferenzieren, führt fast zwangsläufig zu einem segfault.

(Update: was Vlad sagte ... "Meinten Sie:% c")

+0

Ich verstehe das, aber wenn breakStatus als Argument in eine andere Funktion übergeben wird, wie kann noch breakStatus [0] als char extrahiert werden? Ich habe es versucht: Char Check; sscanf (breakStatus [0], "% c", & check); aber ich bekomme einen weiteren Fehler. – Mel

+1

Vielleicht ist es eine gute Idee hinzuzufügen, dass ein Fix wäre, "% s" durch "% c" in der fehlerhaften Zeile zu ersetzen. – Vlad

+0

@Alice: Warum nicht einfach 'check = breakStatus [0]'? – Vlad

2

Verwenden gdb statt Debug Aufdrucke:

#gdb ./myprog 
(gdb) r 

Wenn das Programm nicht mehr mit SIGSEGV einen Blick auf der Stack-Trace:

(gdb) bt 
Verwandte Themen