访问char数组索引时出现C Segmentation Fault

时间:2010-12-05 14:54:11

标签: c segmentation-fault

我正在编写一个反馈循环,它接收用户命令并根据收到的命令处理参数。到目前为止,我的功能看起来像这样:

//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);

 }

我的问题是每当我尝试访问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", &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;
    }
}

如果有人能够提供一些见解,为什么我在一个函数中获得了分段错误而在另一个函数中没有一个,那么我们将非常感激。

编辑:摆脱在我的printf语句中使用%s,因为那不是我的问题所在。理想情况下,我想知道为什么val [0]在函数中起作用而add [0]不起作用,因为它们被赋予了相同类型的参数。

2 个答案:

答案 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