GCC`scanf`分段故障

时间:2013-06-09 01:08:12

标签: 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 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函数内,它似乎“修改”了结构?这很奇怪,因为即使在样本函数“scanf”内部fn之后,它也可以打印出结构字段。但是,一旦从fn返回并跳回main,它会在尝试打印相同信息时出现错误?

有趣的是,如果您将scanf更改为scanf("%c\n", &command);(没有字符集),它似乎工作正常。为了记录,我使用的gcc版本是4.7.2,我正在使用:gcc -O0 -o sample sample.c编译代码。

我唯一想到的是gcc可能不支持字符集吗?我不确定。只是想知道是否有其他人可以解决这个问题?

1 个答案:

答案 0 :(得分:6)

scanf("%[abc]", &command);

写一个字符串而不是一个字符。字符串的尾随空字符正在程序中的&command + 1中写入。

你应该传递给scanf之类的东西:

<{> command command为:

char command[2];