変数を次のように宣言しました
const char* mode;
mode
ユーザーからの値を取得したい。私が使用したとき
scanf("%s",mode)
セグメンテーション違反が発生します。助言がありますか?
電話で警告が表示されるはずです。scanf
宣言することによって
const char* mode;
const charへのポインタを作成します。これは、を指すmode
データを変更できないことを意味mode
します。
次に、電話します。
scanf("%s",mode);
mode
を指すデータを変更しようとします。
gccはこれについて警告します:
warning: writing into constant object (argument 2) [-Wformat]
したがって、 non-constcharmode
へのポインタである必要があります。そして、他の人が述べているように、そのデータを変更できるように、いくつかの実際のデータを指す必要があります。これがセグメンテーション違反の原因である可能性がありますが、初期化の方法を示していないため、わかりにくいです。scanf
mode
mode
通常、配列の最初の文字を指します。では、その配列はどのくらいの大きさである必要がありますか?フォーマットで使用scanf
しているため"%s"
、十分な大きさではない可能性があります。 scanf("%s", mode)
空白で区切られた文字列をからstdin
、が指すバッファに読み込みますmode
。バッファをオーバーフローさせる入力を避けることはできません。
(これが初心者の演習である場合は、おそらく今のところバッファオーバーフローの問題を無視できます。mode
適度に大きいバッファをポイントし、非常に長い入力を提供しないようにしてください。)
ポインタで何か意味のあることを実行できるようにするには、ポインタにメモリを割り当てる必要があります。次のように宣言します。
#define MAX_LENGTH 256
char *mode = malloc(MAX_LENGTH);
また、必要なメモリが大きすぎない場合は、スタック割り当てを使用することをお勧めします。単純に、
char mode[MAX_LENGTH];
一般に、セグメンテーション違反は、CPU が物理的にアドレス指定できないメモリにアクセスしようとする試みです。
これは、変数にメモリを割り当てていないためです。
注:
ただし、Turbo C++ などの一部の c コンパイラでは、メモリを割り当てなくても実行できます。