問題は、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 はこの同じ順序でメモリを割り当てると思います。そのため、ここでも問題を特定することができました。