memcpy的问题
使用Eclipse CDT处理C项目
最奇怪的事情正在发生! 当我调试时,我看到在for循环中的两次迭代后, iu1 值被覆盖。
我现在编辑了这个问题。
请查看下面的代码。
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|||
答案 0 :(得分:-1)
我发现至少有两个潜在的问题:
(*n)->iunit
尚未预先分配至少8 * iUnitSizeJump
内存,则memcpy()会不高兴iu1
和iu2
未初始化(malloc()未初始化)因此您将未初始化的内存复制到(*n)->iunit
。这不会导致程序崩溃,但是由于你的memcpy()会导致每次运行可能不同,你会得到半随机的东西 - 可能不是你的意图。