![](/img/trans.png)
[英]Segmentation fault in accessing & modifying string (char*) array in C
[英]C Segmentation Fault when accessing a 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);
}
我的問題是,每當我嘗試訪問breakAddress [index]時,都會遇到分段錯誤。 當我嘗試printfinging 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]不能在函數上起作用,因為它們被賦予了相同類型的參數。
注意編譯器警告! :)
您已經定義了char breakStatus[20];
,即字符數組。 然后,在printf語句中,得到了printf("...%s...", breakStatus[0]);
。
%s
格式代碼需要指向字符串的指針。 breakStatus [0],但是,是一個char值。 編譯器會警告您要解決的問題:它將char值轉換為char *指針(char值= 0 =>指針地址為0)。 假設char值恰好為零,那么整個過程神奇地變成了NULL指針。 嘗試取消引用NULL指針(或0xff指針,也許……畢竟該值本質上是隨機的)幾乎不可避免地導致了段錯誤。
(更新:弗拉德說了什么……“你的意思是:%c”)
使用gdb代替調試打印:
#gdb ./myprog
(gdb) r
當程序以SIGSEGV停止時,請查看堆棧跟蹤:
(gdb) bt
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.