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", ®);
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", ®isters[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.
void main() ist schlecht, ok? – Puppy
Sie überprüfen oder erzwingen keine Stringlängen. Dies könnte sehr leicht wackeln, wenn der Text nicht korrekt formatiert ist. – Jay
@DeadMG: das ist kein 'void main()'. –