[英]GCC `scanf` segmentation fault
我正在玩C和scanf
函數,並遇到了這個奇怪的錯誤,我似乎無法弄清楚。 給出以下代碼:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int a;
} sample;
void fn(sample *s) {
char command;
scanf("%[abc]", &command);
printf("Read: %c\n", command);
printf("In the sample function:, %i\n", s->a);
}
int main() {
sample *s = malloc(sizeof(sample));
s->a = 4;
printf("Before sample function: %i\n", s->a);
fn(s);
printf("After sample function: %i\n", s->a);
return 0;
}
這似乎是錯誤的。 隨着輸出:
$ ./sample
Before sample function: 4
a
Read: a
In the sample function:, 4
Segmentation fault (core dumped)
我用了gdb並在結構上附加了一個watch
,看來在scanf
函數里面,它似乎“修改”了結構體? 這很奇怪,因為即使在示例函數' fn
'中的scanf
之后,它也能夠很好地打印出struct字段。 但是,一旦從fn
返回並跳回main
,它會在嘗試打印出相同的信息時出現故障?
有趣的是,如果將scanf
更改為scanf("%c\\n", &command);
(沒有字符集)它似乎工作正常。 為了記錄,我使用的gcc版本是4.7.2,我用以下代碼編譯代碼: gcc -O0 -o sample sample.c
。
我唯一想到的是gcc可能不支持字符集嗎? 我不確定。 只是想知道是否有其他人可以解決這個問題?
scanf("%[abc]", &command);
寫一個字符串而不是一個字符。 字符串的尾隨空字符正在程序中的&command + 1
中寫入。
你應該傳遞給scanf
:
command
是command
:
char command[2];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.