GCC`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

我在玩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;
}
我使用了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];