1

私はC言語でこのコードを持っています:

char *options[100000];
int k[100000];
char *param[100000];
int n;
int i,j;
...
scanf("%d",&n);
for (i=0;i<n;i++)
{   
    scanf("%s%d",&options[i],&k[i]);
    param[i]="On";
}
...

プログラムがこのポイントに到達するのと同じように:

scanf("%s%d",&options[i],&k[i]);

ランタイム エラー (スタック オーバーフロー) が発生します。ここでの入力は次のようになります。

word1 number1
word2 number2

等々。なぜこれが起こっているのか分かりません。どうしたの?

4

2 に答える 2

9

わかりました...誰かがスタックオーバーフローの問題に対する答えを提供すると思いましたが、これまでのところ、スタックオーバーフローとは関係のない実際に発生している問題(これについては後で詳しく説明します)について誰もが言及しただけです(問題になることはありますが、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に関しては、メモリ自体を割り当ててポインタを返しますが、ここでも問題ありません。使い終わったら解放することを忘れないでください。これもメモリリークになるからです。

于 2013-09-07T19:17:02.740 に答える
0

char *options[100000] は、文字列ではなく、100000 個の文字列ポインターを割り当てます。scanf が意味不明に渡されています。

于 2013-09-07T18:24:55.217 に答える