簡體   English   中英

GCC`scanf`分段故障

[英]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

commandcommand

char command[2];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM