0

問題は、STRCPY の実行が終了した後に変数 nodeType が変更されていることです。nodeType は、STRCPY 呼び出しで使用されている他の変数に関連する変数ではありません。ただし、同じ構造体にあります。nodeType は、int 値が 3 の列挙型です。

以下は、おそらく最も関連性の高い次の情報です。列挙型と構造体からほとんどの変数を削除したため、それらは表示されません。それらは問題に関連していないと思います。それが違いを生む場合、私はVS2010でコーディングしています。これは btree を作成する課題の一部ですが、私が持っている質問は btree とは関係ありません。

enum NODETYPE
{ 
  ROOTLEAF
};
typedef struct node
{
  char key[MAX_CHILDREN_ROOT][MAX_KEY_LENGTH];
  NODETYPE nodeType;
} nodeT;

... insertElement 関数の一部

for (int i = 0; i < (b->tempNode->numberOfKeys - b->searchData.position); i++)
{
  strcpy(b->tempNode->key[b->tempNode->numberOfKeys - i],  b->tempNode->key[b->tempNode->numberOfKeys - (i + 1)]);
}

..私が呼び出した関数は、要素を挿入するためのものでした。これより前に関数を数回呼び出しましたが、以下のコードのこのセクションが実行されるのはこれが初めてです。STRCPY の実行後、nodeType の値は 1280070990 になります。変数を監視するように設定しましたが、CXX0017 エラーが発生している間は、スコープ内にないことを意味しているだけだと思います。

1280070990 という番号を調べたところ、さまざまなエンジンから多くのゲーム関連の問題が発生しました。メモリアドレスの問題だと思います。

解決策は以下に提供されていました。配列境界の外側に書き込むという単純なエラーでした。私は古いコードをこのように分解し、それを見ていきました。これにより、キー配列キーの外側に書いていた問題を特定できました。

        for (int i = 0; i < (b->tempNode->numberOfKeys - b->searchData.position); i++)
    {
        int sourceI = b->tempNode->numberOfKeys - i - 2;
        int destI = b->tempNode->numberOfKeys - i - 1;
        char *Source = b->tempNode->key[sourceI];
        char *Dest = b->tempNode->key[destI];
        strcpy(Dest, Source);
    }

両方の変数が含まれていた構造体の全体像。

typedef struct node
{
    node *childrenPTR[MAX_CHILDREN_ROOT]; 
    int depth; //Distance from root to node
    char key[MAX_CHILDREN_ROOT][MAX_KEY_LENGTH];
    NODETYPE nodeType;
    int numberOfChildren;
    int numberOfKeys;
    node *parentPTR;
} nodeT;

構造体の変数の順序から、nodeType がキーに続くことがわかります。C はこの同じ順序でメモリを割り当てると思います。そのため、ここでも問題を特定することができました。

4

2 に答える 2

4

長すぎる文字列を key[] のどこかにコピーしています。nodeType にオーバーフローしています。

あなたはこれに慣れていないと思うので、何が起こっているのかを理解できるように、少し読みやすくするためにこれを再コーディングします。おそらく次のようなものです:

for (int i = 0; i < (b->tempNode->numberOfKeys - b->searchData.position); i++)
{
  char *dest = b->tempNode->key[b->tempNode->numberOfKeys - i];
  char *source = b->tempNode->key[b->tempNode->numberOfKeys - (i + 1)];
  strcpy(dest, source);
}

デバッガーを介してそれを歩くと、おそらく配列のどこかsourceよりも長くなります (null ターミネーターを使用すると、文字列が null で終了しますよね?) 。MAX_KEY_LENGTHあなたの配列にさえない何かクレイジーなものかもしれません。

慎重な手順で、より小さく、デバッグしやすいものに分割します。

于 2010-11-23T18:48:06.547 に答える
1

これは、null で終了する文字列ではないものに対して、null で終了する文字列を想定する str* 関数を使用した場合に発生することとまったく同じです。または、コピー先がコピー先に対して十分な大きさでない場合。

于 2010-11-23T18:48:26.787 に答える