わかりました...誰かがスタックオーバーフローの問題に対する答えを提供すると思いましたが、これまでのところ、スタックオーバーフローとは関係のない実際に発生している問題(これについては後で詳しく説明します)について誰もが言及しただけです(問題になることはありますが、1回だけです)これを最初に修正します)。
-----------------
| Your stack |
| (grows down) |
| |
-----------------
| |
| |
| |
| |
| |
| | -- max stack size is here
| |
| |
| |
| |
| |
-----------------
| Your heap |
| (grows up) |
| |
-----------------
そして、非常に大きな配列の束を割り当てようとすると、スペースが不足します
-----------------
| Your stack |
| (grows down) |
| |
| |
| |
| |
| |
| |
| |
| | -- max stack size is here
| |
----------------- -- what you actually need
| |
| |
| |
| |
-----------------
| Your heap |
| (grows up) |
| |
-----------------
したがって、使用可能なスタック領域よりも多くのスタック領域を使用しようとしたため、実行時エラー (スタック オーバーフロー) が発生します。
ここでの秘訣は、ヒープ割り当てを使用することです (ほとんどのプラットフォーム、少なくとも私が聞いたすべてのプラットフォームで) ヒープはスタックよりもはるかに大きいためです。
使用するヒープにメモリを割り当てるにはmalloc
(また、使い終わったら、 を使用してメモリを解放することを忘れないでください。そうしないと、メモリfree
リークが発生します)。
編集:ボーナス:あなたが抱えている他の問題。他の回答は、割り当てられていないメモリにアクセス/逆参照/使用していることを示しているようです。この点については、部分的には大丈夫です。
char配列へのscanf呼び出しポイント(ここに問題があります)と配列kのint(問題ありません。したがって、現在、オプション配列のすべてのエントリはどこにも/どこにもありません。それらにメモリを割り当てる必要があります(再び使用してmalloc
)。
strdupに関しては、メモリ自体を割り当ててポインタを返しますが、ここでも問題ありません。使い終わったら解放することを忘れないでください。これもメモリリークになるからです。