Использование memcpy вызывает перезапись памяти в NULL - PullRequest
0 голосов
/ 06 декабря 2011

Проблемы с memcpy

Работа над проектом C с использованием Eclipse CDT

Самое странное происходит! При отладке я вижу, что значения 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|||

1 Ответ

0 голосов
/ 06 декабря 2011

Я вижу, по крайней мере, две потенциальные проблемы:

  • , если (*n)->iunit не был предварительно выделен как минимум на 8 * iUnitSizeJump памяти, memcpy () будет недоволен
  • iu1 и iu2 неинициализированы (malloc () не инициализируется), поэтому вы будете копировать неинициализированную память в (*n)->iunit.Это не приведет к срыву программы, но вы получите полу-случайный материал из-за вашего memcpy (), который приведет к тому, что каждый запуск будет потенциально отличаться - вероятно, не ваше намерение.
...