Я пытаюсь понять, почему realloc, похоже, повреждает исходный блок памяти, который я расширяю.Я не исключаю, что что-то в моем коде неверно.В коде используются конструкции из C SFML.
sfUint16* num_frames = malloc (sizeof (sfUint16)); if (NULL == num_frames) exit (-1);
(*num_frames) = 10;
printf ("num_frames address: %p\n", num_frames);
printf ("num_frames value: %i\n", (*num_frames));
sfIntRect* base_frames = malloc ((*num_frames) * sizeof (sfIntRect)); if (NULL == base_frames) exit (-1);
printf ("base_frames address: %p\n", base_frames);
for (int a = 0; a < (*num_frames); a++) {
base_frames [a].top = 10;
base_frames [a].left = 10;
base_frames [a].width = 50;
base_frames [a].height = 100;
printf ("base_frames allocation %i: %i, %i, %i, %i\n", a, base_frames [a].top, base_frames [a].left, base_frames [a].width, base_frames [a].height);
}
sfIntRect* sample_frame = malloc (sizeof (sfIntRect)); if (NULL == sample_frame) exit (-1);
sample_frame->top = 20;
sample_frame->left = 20;
sample_frame->width = 200;
sample_frame->height = 300;
printf ("sample_frame address: %p\n", sample_frame);
printf ("base_frames[5] preassignment: %i, %i, %i, %i\n", base_frames [5].top, base_frames [5].left, base_frames [5].width, base_frames [5].height);
base_frames [5] = (*sample_frame);
printf ("base_frames[5] postassignment: %i, %i, %i, %i\n", base_frames [5].top, base_frames [5].left, base_frames [5].width, base_frames [5].height);
free (sample_frame);
printf ("base_frames[5] postfree of sample_frame: %i, %i, %i, %i\n", base_frames [5].top, base_frames [5].left, base_frames [5].width, base_frames [5].height);
sfIntRect* new_frames = realloc (base_frames, (*num_frames) * 2);
if (new_frames) base_frames = new_frames;
else free (new_frames);
printf ("address of base_frames: %p\n", base_frames);
for (int a = 0; a < (*num_frames) * 2; a++) {
printf ("base_frames allocation %i: %i, %i, %i, %i\n", a, base_frames [a].top, base_frames [a].left, base_frames [a].width, base_frames [a].height);
}
free (num_frames);
free (base_frames);
return 0;
Вывод компилятора выглядит следующим образом (очевидно, адреса памяти меняются за цикл):
Вывод программы
Информация: sfIntRect - это объединенные четыре целочисленных значения.
Я заметил, что из всего, что я прочитал в realloc, он работает так, что new_frames возвращает тот же исходный адрес, что и base_framesи размер блока увеличился.Дополнения к блоку не инициализированы, поэтому я ожидаю, что значения этих конструкций будут странными, какими они и являются.Тем не менее, первые десять распределений не должны быть скомпрометированы, и похоже, что два из них.Это происходит при каждом запуске с одними и теми же элементами.
Может ли кто-нибудь помочь пролить свет на это?