まず、デバッグぐらいはしましょう。
プログラミングは『書いて終わり』…ではありません。
『DIYをやってみたい』とか『俺はDIYが趣味だ』と言う人が「椅子を作りたいけど誰か設計図を書いて、それをもとに作ってくれ」とか「椅子を作ったけど高さが合わないから誰か修繕してくれ」と言いますか?
プログラミングも「自分で設計し、自分でコーディングし、自分でデバッグまでする」のが当たり前です。
それすらしないのならいっそやめた方がいいです。だってそれは「他人任せで自分は努力せず、責任転嫁する人」ですから。
なのでデバッグぐらいはしましょう。
出来ればデバッガ(GDB等)を使ってデバッグした方がいいですが、常にそれができるとは限りません。(手元にデバッガが無いとか、使い方が分からないとか……)
その場合はいわゆるprintfデバッグをしましょう。
たとえば、
#include<stdio.h>
int main( void ){
int n;
int nums[n];
printf( "%d\n", n );
scanf( "%d", &n );
printf( "%d", sizeof(nums) );
return 0;
}
というようなコードをprintfデバッグをするなら、それぞれの行の間に printfで数字等を出力する。
// 例
#include<stdio.h>
int main( void ){
printf( "ID = %d\n", 1 );
int n;
printf( "ID = %d\n", 2 );
int nums[n];
printf( "ID = %d\n", 3 );
printf( "%d\n", n );
printf( "ID = %d\n", 4 );
scanf( "%d", &n );
printf( "ID = %d\n", 5 );
printf( "%d", sizeof(nums) );
printf( "ID = %d\n", 6 );
return 0;
}
うまくいけば、
ID = 1
ID = 2
ID = 3
...
ID = 6
のようになるはずです。("ID = <数字>"でなくともいいが、今回のサンプルコードではサイズを表示したりとかの数字が出力される処理があるので)
でもVSCode + MinGW でやると、ID = 1 と ID = 2 までは出力されるが ID = 3 以降が出力されない。
ということは
printf( "ID = %d\n", 1 );
int n;
printf( "ID = %d\n", 2 );
の部分は普通に通る。でも次の int nums[n];
辺りでなんか悪さをしていそうですね。
で、その行は 単純に配列を宣言しているだけです。なにも問題がなさそうですね。一見。
でも、よく考えてみてください。そもそも nとはなんですか? そう、int nとして宣言されたものですね。
ただ、この変数 n は初期化、していませんよね? C言語では初期化していないと不定値が入ります。
環境とかによっては 初期化せずとも 0 になっていることもありますが、私の手元の環境では 4218896
のようなでたらめな値になっています。
こういう変数や配列はスタック領域にセットされます。C言語でいうmalloc/freeでやるやつはヒープ領域にセットされます。
スタック領域はサイズが決まっていて、デカい要素数で確保する事はできません。
今回の場合、nを初期化していないので n = 4218896
のような状態になっているはです。(数字は違うとは思うが。不定値なので)
そうすると、int nums[4218896];
という状態になります。
でもスタック領域にはそんなサイズは取れないので、エラー的なものに。
(確か、Segmentation Faultだったはず…)
よって、それ以降の処理がされずにクラッシュするのです。
GDBのようなデバッガを使う場合も発想自体は同じです。
単にprintf関数を使って「ここまで通った」とか「現在のnの値は○○」とかみたいにやるのか、next,step等を使うのか、ボタンを使って動かすのかとかが違うだけです。
今回の質問にあるコードだと、
C
1int n, x, cnt;
2int a[n], b[n];
3scanf("%d %d", &n, &x);
となっています。int a[n], b[n];
の時点では、n, x, cmt は初期化されていません。
となると、n = 4218896, x = 4218896, cnt = 4218896 のような状態のはずです。(数字はともかく)
この状態で a[n] を置き換えてみると a[4218896], b[4218896] となります。
でもスタック領域にはそんなに取れません。
よってクラッシュ。
そのため、それ以降の scanf関数だのなんだのの処理がされないのです。
まずはデバッグ方法を覚えましょう。