скомпилировал следующий фрагмент кода с помощью команды: gcc -g -std=c99 src.c
источник.c:
#include <stdio.h>
#include <stdlib.h>
void fill(int* arr, int len, int val) {
for (int i = 0; i < len; ++i) arr[i] = val;
}
int main()
{
printf("Hello World\n");
int *p1, *p2;
int *arr1 = malloc (sizeof(int) * 10);
int *arr2 = malloc (sizeof(int) * 10);
printf("BEFORE======================\narr1=%p, arr2=%p\n", arr1,arr2);
fill(arr1, 10, 17);
fill(arr2, 10, 23);
p1 = &arr1[9];
p2 = &arr2[9];
printf("values at addresses %p, %p are respectively: %d, %d\n", p1, p2, *p1, *p2);
arr1 = realloc(arr1, 200);
arr2 = realloc(arr2, 200);
printf("AFTER======================\narr1=%p, arr2=%p\n", arr1,arr2);
fill(arr1, 200, 239);
fill(arr2, 200, 347);
printf("values at addresses %p, %p are respectively: %d, %d\n", p1, p2, *p1, *p2);
p1 = &arr1[99];
p2 = &arr2[99];
printf("values at addresses %p, %p are respectively: %d, %d\n", p1, p2, *p1, *p2);
free(arr2);
free(arr1);
return 0;
}
Я просто пробовал динамическое распределение памяти. К моему удивлению, бесплатный звонок на arr2
не работает.
Судя по дампу памяти, после перераспределения массивы перекрываются, и я не знаю почему.
@stark, это хороший момент, добавленный к моему ответу ниже, чтобы завершить его.
Второй параметр realloc — это размер в байтах.
Поэтому в этих строках:
arr1 = realloc(arr1, 200);
arr2 = realloc(arr2, 200);
Вы выделяете как arr1
, так и arr2
по 200 байт, а не элементы int
.
Чтобы исправить это, измените его на:
arr1 = realloc(arr1, sizeof(int) * 200);
arr2 = realloc(arr2, sizeof(int) * 200);
Вторая проблема (как прокомментировал @stark ) заключается в том, что в первом экземпляре этой строки (сразу после fill
) массивов:
printf("values at addresses %p, %p are respectively: %d, %d\n", p1, p2, *p1, *p2);
p1
и p2
по-прежнему указывают на массивы до перераспределения. Поэтому они недействительны, и разыменование их приводит к неопределенному поведению.
(Второй экземпляр этой строки подходит, потому что p1
и p2
присвоены адреса новых массивов).
p1 и p2 недействительны после перераспределения, поскольку arr1 и arr2 могли быть перемещены.