问题是在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.我将变量设置为watch,而它在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;
我们可以从struct中的变量顺序看到nodeType跟随key。我相信C会以同样的顺序分配内存。所以我也可以在这里查看问题。
答案 0 :(得分: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终结符 - 你的字符串是否正确终止你的字符串?)MAX_KEY_LENGTH
更长。甚至在你的阵列中它甚至可能是疯狂的东西。
将其分解为更小,更容易以谨慎的步骤进行调试。
答案 1 :(得分:1)
如果你使用一个str *函数,它需要一个空终止的字符串,而不是一个空终止的字符串。或者,如果您要复制的内容对于您正在复制的内容而言不够大。