私は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
し、構造体にaを付けましたが、関数内でscanf
構造体を「変更」しているようです? scanf
サンプル関数 ' ' の内部の後でもfn
、構造体フィールドを正常に出力できるため、これは奇妙です。ただし、 から戻って に戻るfn
とmain
、同じ情報を出力しようとするとエラーが発生しますか?
興味深いことに、scanf
to をscanf("%c\n", &command);
(文字セットなしで) 変更すると、問題なく動作するようです。記録のために、私が使用している gcc のバージョンは 4.7.2 で、コードを次のようにコンパイルしていますgcc -O0 -o sample sample.c
。
私の唯一の考えは、おそらく文字セットが gcc でサポートされていないということですか? わからない。他の誰かがこれをクリアできるかどうか疑問に思っていますか?