【发布时间】:2011-12-06 14:10:41
【问题描述】:
memcpy 的问题
使用 Eclipse CDT 处理 C 项目
最奇怪的事情正在发生! 当我调试时,我看到 iu1 值在 for 循环中的两次迭代后被覆盖。
我现在已经编辑了这个问题。
请看下面的代码。
typedef struct IUnitStruct
{
long ptr;
char key[1];
}iUnit;
void createInternalNode(internalNode ** n)
{
int iUnitSizeJump = 1012 ;
iUnit* iu1 = (iUnit*) malloc(iUnitSizeJump);
iu1->ptr = -1;
strcpy(iu1->key,"NullKey1");
iUnit* iu2 = (iUnit*) malloc(iUnitSizeJump);
iu2->ptr = -2;
strcpy(iu2->key,"NullKey2");
for (int i = 0 ; i < 8; i=i+2 )
{
memcpy(&(*n)->iunit[(i)*(iUnitSizeJump)],iu1,iUnitSizeJump);
memcpy(&(*n)->iunit[(i+1)*(iUnitSizeJump)],iu2,iUnitSizeJump);
}
}
void printNode(internalNode *n, int iUnitSize)
{
for (int i = 0 ; i < 8; i++ )
{
cout << "||Page:" ;
cout << n->iunit[i*iUnitSize].ptr;
cout << "|";
cout << n->iunit[(i*iUnitSize)].key;
cout << "|| ";
}
}
这是输出
||Page:-1|NullKey1||
||Page:-2|NullKey2||
||Page:0|||
||Page:-2|NullKey2||
||Page:0|||
||Page:-2|NullKey2||
||Page:0|||
||Page:-2|NullKey2||
我需要它显示
||Page:-1|NullKey1||
而不是
||Page:0|||
【问题讨论】:
-
严重建议:停止使用 C/C++,它真的不存在。只有 C 和另一种名为 C++ 的语言。一旦你开始正确使用 C++,你就不会再遇到这类问题了。
-
n和n->iunit的定义是什么? -
iUnitSizeJump 的目的是什么?乍一看,您可能想要访问元素 iunit[i]、iunit[i+1],而不是使用那个乘数。
-
什么是n?你能提供更多细节吗?
-
您的代码充满了缓冲区溢出。当您尝试将 strcpy() 数据写入 structs Key 时,首先 malloc() 具有字符串所需的适当大小的 char[] (它会非常快地衰减为指针)。您可以使用 strlen() 来获取字符串大小。然后 malloc(sizeof(char) * strlen(stringToCopy));为您的字符串保留免费商店的空间。这只是一个开始.. 如果您的数据结构索引超出数据结构的大小(另一个缓冲区溢出)... .. sighs ..