我正在编写一个反馈循环,它接收用户命令并根据收到的命令处理参数。到目前为止,我的功能看起来像这样:
//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);
}
我的问题是每当我尝试访问breakAddress [index]时,我都会遇到Segmentation Fault。当我尝试打印breakStatus和breakAddress时,它们都保持预期的值(输入示例将是 break set x0001 ,其中breakStatus =“set”和breakAddress =“x0001”)。
我知道如果我使用%c的说明符,或者 printf(“breakStatus [0]是%c \ n”,breakStatus [0]); ,它会返回一个有效值。但是我将breakStatus和breakAddress传递给另一个函数,并在该函数中检查breakAddress [0] =='x',我会立即收到分段错误。
我不知道如何处理这件事。我已经尝试将breakAddress [0]转换为char,但我仍然得到同样的错误。
让我感到困惑的是,我几乎以完全相同的方式(相同的char []初始化,相同的scanf过程)对我的Set部分进行了编码,当我尝试从其中一个变量中检索索引时,它完全正常。
以下是我的set()和executeBreak()函数的一部分供参考:
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;
}
}
如果有人能够提供一些见解,为什么我在一个函数中获得了分段错误而在另一个函数中没有一个,那么我们将非常感激。
编辑:摆脱在我的printf语句中使用%s,因为那不是我的问题所在。理想情况下,我想知道为什么val [0]在函数中起作用而add [0]不起作用,因为它们被赋予了相同类型的参数。答案 0 :(得分:4)
注意编译器警告! :)
您已定义char breakStatus[20];
,即一组字符。然后,在printf语句中,您已经printf("...%s...", breakStatus[0]);
。
%s
格式代码需要指向字符串的指针。但是,breakStatus [0]是一个char值。编译器警告你它做了什么来解决这个问题:它将char值转换为char *指针(char值= 0 =>指针地址为0)。假设char值恰好为零,那么整个事物就会神奇地变成NULL指针。试图取消引用一个NULL指针(或者一个0xff指针,也许......毕竟这个值基本上是随机的)几乎不可避免地导致了段错误。
(更新:弗拉德说的......“你的意思是:%c”)
答案 1 :(得分:2)
使用gdb而不是调试打印:
#gdb ./myprog
(gdb) r
当程序因SIGSEGV而停止时,请查看堆栈跟踪:
(gdb) bt