GCC`scanf`分段错误
我在玩C和scanf函数时遇到了一个奇怪的错误,我似乎无法理解。给定以下代码:GCC`scanf`分段错误,c,gcc,struct,scanf,C,Gcc,Struct,Scanf,我在玩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 s
#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;
}
我使用了gdb并在结构上附加了一个watch
,似乎在scanf
函数中,它似乎在“修改”结构?这很奇怪,因为即使在示例函数“fn
”中使用了scanf
”之后,它也能够很好地打印出结构字段。但是,一旦从fn
返回并跳回main
,它在尝试打印相同信息时会出现故障
有趣的是,如果将scanf
更改为scanf(“%c\n”,&command)代码>(没有字符集)它似乎工作正常。为了记录在案,我使用的gcc版本是4.7.2,我使用以下代码编译代码:gcc-O0-o sample.c
我唯一的想法是,也许gcc不支持字符集?我不确定。只是想知道是否还有其他人可以澄清这个问题?scanf(“%[abc]”,&command)代码>
写入字符串而不是单个字符。字符串的尾随空字符正在程序的&command+1
中写入
您应该转到scanf
类似以下内容:
命令
,其中命令
为:
char command[2];
gcc(Ubuntu/Linaro 4.7.2-2ubuntu1)4.7.2它与gcc-O0-o sample.cAhh一起工作。非常感谢。事实上,这很有道理。真不敢相信我没想到。不客气!还要注意,如果将多个字符传递给scanf
,将导致缓冲区溢出。要进行错误恢复,您应该使用sscanf
查看fgets
,而不是scanf
。如果您不介意的话,这只是另一个简单的问题,它为什么会在其他版本的GCC或clang上工作?您的程序调用未定义的行为,因为未定义就是未定义的,它可能在星期六工作,但在星期一失败。您还应该使用scanf(“%1[abc]”,&command)
将字符串限制为单个字符,这样它就不会溢出2个字符的缓冲区。。。
char command[2];