0

私はC++でプログラムを書いていますが、何らかの理由で次の行でセグメンテーションエラーが発生しています。

char* param= new char[200];

私はさまざまなバリエーションを試し、その前に置くことさえ試みました

int* param= new int;//for no reason

同じエラーが発生します。この問題を引き起こすために私は何をしたでしょうか?

このような単純なメモリ割り当てが問題を引き起こす可能性があります。

プログラムの残りの部分を含めますが、1000行を超えています。ただし、詳細についてはお気軽にお問い合わせください。

4

5 に答える 5

8

この時点より前に、メモリの割り当てと解放を行いますか?もしそうなら、あなたはおそらく何らかの方法でヒープを破壊しました。より多くのコードを見ずにさらに診断することは不可能です。

于 2009-05-13T14:40:08.353 に答える
2

ニールは正しい方向に進んでいると思います。おそらく、以前に踏みにじったもので、そこで捕らえられているだけです。

次のことを確認しましたか?

  1. 以前の割り当てはすべて成功しました。
  2. 配列の終わりまたは始まりを超えて記述したことはありません(境界チェックのための情報とツールがたくさんあります)。

[編集] 4GBのRAMを搭載することについてのコメントに応えて、コードが次のことを効果的に実行するとします。

unsigned int amountToAllocate = 0;
amountToAllocate -= 1;

int* someStorage = new int[amountToAllocate];

someStorage[0] = 5;

...amountToAllocateはであるためunsigned int、最大値(unsigned intハードウェアでsが32ビットの場合は4294967295)にラップラウンドします。したがって、4294967295 * 4バイトを割り当てようとしていることになります(ここでも、intsが32ビットであると仮定します)...これは〜4 * 4GBであり、失敗して厄介な死を迎えます。

于 2009-05-13T14:49:02.923 に答える
2

これがあなたの使い方です。たとえば、charをintに置き換えていくつかの値を格納しましたが、charでも同じように機能します。

#include <iostream>

using namespace std;

int main()
{
    int * param = new int[200];

    for (int i = 0; i < 200; ++i) param[i] = i;
    for (int i = 0; i < 200; ++i) cout << param[i] << endl;

    delete[] param;

    return 0;
}
于 2009-05-13T14:49:14.173 に答える
1

まず、この行が問題であることを確認します。コメントアウトするとどうなりますか?(またはに置き換えますchar *param = NULL

第二に、これがセグメンテーション違反を引き起こす可能性がある唯一の方法は、以前に何かがすでにうまくいかなかった場合です。この前に何が起こりますか?

関連するコードスニペットを表示できない場合は、それが問題です。コードの一部をコメントアウトするか、潜在的な問題点を特定します。遅かれ早かれ、問題を要約して、エラーを再現する小さなサンプルにすることができるようになります。その時点で、問題(および解決策)は明らかである可能性があり、そうでない場合は、少なくとも、私たちに示すための適度なサイズのコードサンプルがあります。

于 2009-05-13T16:10:59.360 に答える
0

@jalfが言っていることを2番目に。これがセグメント障害のある回線であると本当に確信していますか?それは非常にありそうもないです。

権限のないメモリにアクセスしようとすると、セグメンテーション違反が発生します。特定のメモリを要求するのではなく、「新しい」メモリ割り当てで取得できるようにするため、問題は別の場所にあるはずです。

あなたが本当にすべきことは、あなたのコードにたくさんのprintステートメントを入れることです。(デバッガーの使用に慣れていないと思いますか?)これにより、セグメンテーション違反が発生する前にプログラムがどこまで到達するかを確認できます。幸運を!

于 2009-05-13T16:47:00.487 に答える