1

変数を次のように宣言しました

const char* mode;

modeユーザーからの値を取得したい。私が使用したとき

scanf("%s",mode)

セグメンテーション違反が発生します。助言がありますか?

4

3 に答える 3

5

電話で警告が表示されるはずです。scanf

宣言することによって

const char* mode;

const charへのポインタを作成します。これは、を指すmodeデータを変更できないことを意味modeします。

次に、電話します。

scanf("%s",mode);

modeを指すデータを変更しようとします。

gccはこれについて警告します:

warning: writing into constant object (argument 2) [-Wformat]

したがって、 non-constcharmodeへのポインタである必要があります。そして、他の人が述べているように、そのデータを変更できるように、いくつかの実際のデータを指す必要があります。これがセグメンテーション違反の原因である可能性がありますが、初期化の方法を示していないため、わかりにくいです。scanfmode

mode通常、配列の最初の文字を指します。では、その配列はどのくらいの大きさである必要がありますか?フォーマットで使用scanfしているため"%s"、十分な大きさではない可能性があります。 scanf("%s", mode)空白で区切られた文字列をからstdin、が指すバッファに読み込みますmode。バッファをオーバーフローさせる入力を避けることはできません。

(これが初心者の演習である場合は、おそらく今のところバッファオーバーフローの問題を無視できます。mode適度に大きいバッファをポイントし、非常に長い入力を提供しないようにしてください。)

于 2012-05-17T06:11:01.310 に答える
2

ポインタで何か意味のあることを実行できるようにするには、ポインタにメモリを割り当てる必要があります。次のように宣言します。

#define MAX_LENGTH 256
char *mode = malloc(MAX_LENGTH);

また、必要なメモリが大きすぎない場合は、スタック割り当てを使用することをお勧めします。単純に、

char mode[MAX_LENGTH];
于 2012-05-17T05:51:02.000 に答える
2

一般に、セグメンテーション違反は、CPU が物理的にアドレス指定できないメモリにアクセスしようとする試みです。

これは、変数にメモリを割り当てていないためです。
注:
ただし、Turbo C++ などの一部の c コンパイラでは、メモリを割り当てなくても実行できます。

于 2012-05-17T05:54:33.770 に答える