使用memcpy会导致内存覆盖为NULL

时间:2011-12-06 14:10:41

标签: c linux gcc memcpy

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|||

1 个答案:

答案 0 :(得分:-1)

我发现至少有两个潜在的问题:

  • 如果(*n)->iunit尚未预先分配至少8 * iUnitSizeJump内存,则memcpy()会不高兴
  • iu1iu2未初始化(malloc()未初始化)因此您将未初始化的内存复制到(*n)->iunit。这不会导致程序崩溃,但是由于你的memcpy()会导致每次运行可能不同,你会得到半随机的东西 - 可能不是你的意图。