Вызов free () для динамически размещенного массива в C, похоже, изменяет данные, хранящиеся в другом массиве? - PullRequest
2 голосов
/ 22 февраля 2020

У меня есть следующий C код:

char *a, *b;
int count;
a = malloc(10);
b = malloc(10);
for(count=0;count<10;count++){
  b[count] = 'a';}
memcpy(&a, &b, 10);
for(count=0;count<10;count++){
  printf("%c %c\n", a[count], b[count]);}
free(b);
for(count=0;count<10;count++){
  printf("%c, ", a[count]);}

Однако на выходе первые 8 элементов массива, похоже, удаляются путем освобождения b:

./a.out
a a
a a
a a
a a
a a
a a
a a
a a
a a
a a
, , , , , , , , a, a,

Может кто-нибудь попытаться объяснить, что здесь происходит? Кажется, я не могу найти причину этого.

Ответы [ 2 ]

3 голосов
/ 22 февраля 2020

free(b) не проблема, строка:

memcpy(&a, &b, 10);

Должно быть:

memcpy(a, b, 10);

a и b уже указатели на ячейки памяти, Вы не должны передавать их адреса, это приведет к неопределенному поведению.

2 голосов
/ 22 февраля 2020

Я не могу воспроизвести вашу проблему (в Visual Studio / MSV C), но есть проблема (и почти наверняка неопределенное поведение), вызванная этой строкой:

memcpy(&a, &b, 10);

The * Переменные 1004 * и b являются уже указателями, поэтому вам не нужно передавать их адреса memcpy. Просто используйте:

memcpy(a, b, 10);

В вашем коде вы могли бы перезаписать значение адреса, хранящееся в обоих / любом из указателей.

РЕДАКТИРОВАТЬ: Компилятор clang-cl выявляет проблему, давая это:

предупреждение: memcpy всегда будет переполнен; целевой буфер имеет размер 8, но аргумент размера равен 10 [-Wfortify-source]

...