質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

解決済

プログラムが標準入力を待たず終了する

takey
takey

総合スコア312

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

3回答

0評価

0クリップ

1078閲覧

投稿2020/09/21 10:25

編集2020/09/21 11:26

環境

環境はWindowsで、VSCodeのコンソールからコンパイルしています。

> g++ -v Using built-in specs. COLLECT_GCC=C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin\g++.exe COLLECT_LTO_WRAPPER=C:/Program\ Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/bin/../libexec/gcc/x86_64-w64-mingw32/8.1.0/lto-wrapper.exe Target: x86_64-w64-mingw32 Configured with: ../../../src/gcc-8.1.0/configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=/mingw64 --with-sysroot=/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64 --enable-shared --enable-static --disable-multilib --enable-languages=c,c++,fortran,lto --enable-libstdcxx-time=yes --enable-threads=posix --enable-libgomp --enable-libatomic --enable-lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --with-arch=nocona --with-tune=core2 --with-libiconv --with-system-zlib --with-gmp=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-mpfr=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-mpc=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-isl=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-pkgversion='x86_64-posix-seh-rev0, Built by MinGW-W64 project' --with-bugurl=https://sourceforge.net/projects/mingw-w64 CFLAGS='-O2 -pipe -fno-ident -I/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/include -I/c/mingw810/prerequisites/x86_64-zlib-static/include -I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include' CXXFLAGS='-O2 -pipe -fno-ident -I/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/include -I/c/mingw810/prerequisites/x86_64-zlib-static/include -I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include' CPPFLAGS=' -I/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/include -I/c/mingw810/prerequisites/x86_64-zlib-static/include -I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include' LDFLAGS='-pipe -fno-ident -L/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64/opt/lib -L/c/mingw810/prerequisites/x86_64-zlib-static/lib -L/c/mingw810/prerequisites/x86_64-w64-mingw32-static/lib ' Thread model: posix gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)

現象

以下のプログラムをコンパイルして実行しても、標準入力を待たずにプログラムが終了します。

cpp

/* d2.cpp*/ #include <bits/stdc++.h> using namespace std; void solve(){ int N, K; cin >> N >> K; int grid[1005][2005]; // この行をコメントアウトすると、標準入力を待つようになる } int main(int argc, char const *argv[]){ solve(); return 0; }
> g++ d2.cpp > ./a > (標準入力を待たずプログラムが終了する)

原因がわかる方いらっしゃいますでしょうか?

よろしくお願いします。

追記[2020/09/21 19:36]

以下のように、static int grid[1005][2005];vector<vector<int>> grid(1005, vector<int>(2005, 0));に変更したら標準入力を待つようになりました。

cpp

/* d2.cpp*/ #include <bits/stdc++.h> using namespace std; void solve(){ int N, K; cin >> N >> K; // int grid[1005][2005]; // この行をコメントアウトすると、標準入力を待つようになる static int grid[1005][2005]; // OK // vector<vector<int>> grid(1005, vector<int>(2005, 0)); // OK } int main(int argc, char const *argv[]){ solve(); return 0; }

追記2[2020/09/21/ 19:51]

標準入力が最適化によって消えているのではないかという指摘がありましたので、以下のようにNKを出力するプログラムにしてみましたが、やはりプログラムは終了しました。

cpp

// #include <bits/stdc++.h> #include <iostream> #include <vector> using namespace std; int solve(){ int N, K; cin >> N >> K; int grid[1005][2005]; // この行をコメントアウトすると、標準入力を待つようになる // static int grid[1005][2005]; // OK // vector<vector<int>> grid(1005, vector<int>(2005, 0)); // OK cout << N+K << endl; return N+K; } int main(int argc, char const *argv[]){ int ret; ret = solve(); cout << ret << endl; return 0; }
> g++ abc/086/d2.cpp > ./a > (標準入力を待たずに終了する)

追記3(BA後)

多くの方がご指摘いただいているとおり、原因はスタックオーバーフローによるものだと思われます。

vectorだとOKな理由は、vectorはヒープ領域だからなようです。

https://cpprefjp.github.io/reference/vector/vector.html

配列と違い、ストレージはvector自体が管理するため、自動的に領域の拡張が行われる。

皆様ご回答いただきありがとうございました。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

cateye

2020/09/21 10:28

int grid[1005][2005];は、スタックには大きすぎませんか? 8M近く有りますよ。
hidezzz

2020/09/21 10:32

私も確保されているスタックサイズを越えている気がします。 根本的解決ではなく試すだけにしてほしいのですが、staticを付けて static int grid[1005][2005]; とするとどうなりますか?
takey

2020/09/21 10:37

追記いたしました。staticやvectorにしたら標準入力を待つようになりました。
Zuishin

2020/09/21 11:06

単に強制終了してるんでしょうね。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。