Я пишу простую программу, чтобы убедиться, что я полностью понимаю, как работают указатели в Си, когда я прохожу гарвардский CS50.Вот код:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *a = malloc(sizeof(int));
*a = 5;
printf("the address of pointer a is: %p\n", &a);
printf("the address that a is pointing to is: %p\n", a);
printf("the contents of a are: %i\n", *a);
printf("please enter a new value for a: \n");
scanf("%i", a);
printf("the address of pointer a is: %p\n", &a);
printf("the address that a is pointing to is: %p\n", a);
printf("the contents of a are: %i\n", *a);
int *b = malloc(sizeof(int));
*b = 7;
printf("the address of pointer b is: %p\n", &b);
printf("the address that b is pointing to is: %p\n", b);
printf("the contents of b are: %i\n", *b);
a = b;
printf("setting a = b\n");
printf("the address of pointer a is: %p\n", &a);
printf("the address that a is pointing to is: %p\n", a);
printf("the contents of a are: %i\n", *a);
free(a);
free(b);
}
Компилируется без проблем, но при выполнении я получаю следующую ошибку: "* Ошибка в` ./address ': двойное освобождение или повреждение (fasttop): 0x00000000018b7030 * Прервано "
Эта проблема исчезнет, если я избавлюсь от выражений free (a) или free (b), однако valgrind обнаружит утечку памяти:" == 9626 ==4 байта в 1 блоке определенно теряются в записи потерь 1 из 1 == 9626 == в 0x4C2AB80: malloc (в /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) == 9626 == по 0x4206AD: main (address.c: 6) "
Я просмотрел другие вопросы здесь и другие веб-сайты, которые упоминают двойную свободную коррупцию, но все еще не могу понять, в чем проблема ... У меня есть чувствочто ответ прост, и проблема, вероятно, заключается в утверждении «a = b», однако я не совсем понимаю, почему у меня не было бы возможности иметь один указатель на область памяти, на которую указывает другой,а затем освободить память, занятую обоими указателями ...