【发布时间】:2011-05-20 13:10:42
【问题描述】:
我正在编写一个反馈循环,它接收用户命令并根据收到的命令处理参数。到目前为止,我的函数如下所示:
//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] 时,都会遇到分段错误。当我尝试 printf-ing breakStatus 和 breakAddress 时,它们都保存了预期值(输入示例是 break set x0001,其中 breakStatus = "set" 和 breakAddress = "x0001")。
我知道如果我使用 %c 或 printf("breakStatus[0] is %c\n", breakStatus[0]); 的说明符,它会返回一个有效值。但是,我将 breakStatus 和 breakAddress 传递给另一个函数,并在该函数中检查是否 breakAddress[0] == 'x',我立即收到分段错误。
我不确定如何处理。我尝试将 breakAddress[0] 转换为 char ,但仍然遇到相同的错误。
真正让我困惑的是,我几乎以完全相同的方式对我的 Set 部分进行了编码(相同的 char[] 初始化,相同的 scanf 进程),当我尝试从其中一个变量中检索索引时,它工作得非常好。
以下是我的部分 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] 不起作用,因为它们被赋予了相同类型的参数。
【问题讨论】:
-
您没有检查或强制执行字符串长度。如果文本格式不完全正确,这很容易让您感到不安。
-
@DeadMG:那不是
void main()。
标签: c segmentation-fault