Это назначение просит нас выделить две переменные типа int, используя malloc()
(с именами var1
и var2
), распечатать адреса каждой переменной (адрес указателя в стеке и адрес в куче).), затем используйте free()
, чтобы освободить var1
, снова напечатайте адреса, затем выделите еще один пробел в куче для var1
и напечатайте адреса в третий раз.Я считаю, что инструктор пытается показать нам, что адрес кучи для var1
должен измениться, но он всегда остается прежним ... если я не удаляю free(var1)
из кода.Инструктор сделал аналогичную демонстрацию, но не использовал free()
для освобождения каких-либо переменных, поэтому мы никогда не видели, как это должно работать.
Вот мой код:
#include <stdio.h>
#include <stdlib.h>
void main()
{
int *var1 = (int*)malloc(sizeof(int));
*var1 = 1000;
int *var2 = (int*)malloc(sizeof(int));
*var2 = 2000;
printf("Addresses of var1\n");
printf("Pointer on stack: %p / Heap: %p\n\n", &var1, var1);
printf("Addresses of var2\n");
printf("Pointer on stack: %p / Heap: %p\n\n", &var2, var2);
free(var1);
printf("AFTER DEALLOCATING var1 FROM THE HEAP\n");
printf("Addresses of var1\n");
printf("Pointer on stack: %p / Heap: %p\n\n", &var1, var1);
printf("Addresses of var2\n");
printf("Pointer on stack: %p / Heap: %p\n\n", &var2, var2);
var1 = (int*) malloc(sizeof(int));
*var1 = 1500;
printf("NEW MEMORY ADDRESS ALLOCATED FOR var1\n");
printf("Addresses of var1\n");
printf("Pointer on stack: %p / Heap: %p\n\n", &var1, var1);
printf("Addresses of var2\n");
printf("Pointer on stack: %p / Heap: %p\n\n", &var2, var2);
}
Этот код приводит к таким выводам:
Addresses of var1
Pointer on stack: 0xffffcbf8 / Heap: 0x600000390
Addresses of var2
Pointer on stack: 0xffffcbf0 / Heap: 0x6000003b0
AFTER DEALLOCATING var1 FROM THE HEAP
Addresses of var1
Pointer on stack: 0xffffcbf8 / Heap: 0x600000390
Addresses of var2
Pointer on stack: 0xffffcbf0 / Heap: 0x6000003b0
NEW MEMORY ADDRESS ALLOCATED FOR var1
Addresses of var1
Pointer on stack: 0xffffcbf8 / Heap: 0x600000390
Addresses of var2
Pointer on stack: 0xffffcbf0 / Heap: 0x6000003b0
Как видите, адрес кучи не меняется для var1
когда я освобождаю его, и он не меняется, когда я снова выделяю пространство для var1
.Однако, если я просто удаляю строку free(var1)
из программы, она просто назначает вторую область памяти для var1
и указывает на нее в куче, которая имеет другой адрес памяти:
Addresses of var1
Pointer on stack: 0xffffcbf8 / Heap: 0x600000390
Addresses of var2
Pointer on stack: 0xffffcbf0 / Heap: 0x6000003b0
AFTER DEALLOCATING var1 FROM THE HEAP
Addresses of var1
Pointer on stack: 0xffffcbf8 / Heap: 0x600000390
Addresses of var2
Pointer on stack: 0xffffcbf0 / Heap: 0x6000003b0
NEW MEMORY ADDRESS ALLOCATED FOR var1
Addresses of var1
Pointer on stack: 0xffffcbf8 / Heap: 0x600000420
Addresses of var2
Pointer on stack: 0xffffcbf0 / Heap: 0x6000003b0
(Просто для ясности, все, что я сделал, это удалил free(var1)
из предыдущего кода, поэтому раздел «ПОСЛЕ ДЕАЛЛОКАЦИИ var1» теперь показывает тот же адрес кучи, что и предыдущий набор, но он изменяет адрес кучи в var1 втретий раздел.)
Кто-нибудь может мне сказать, что здесь происходит?Единственное логическое объяснение, которое я могу придумать, состоит в том, что когда я использую free()
для освобождения var1
и затем печатаю адрес, это просто печатает последний адрес, на который он указал, и затем, когда я выделяю память дляvar1
во второй раз, просто "засыпать" предыдущий адрес новым значением var1
.Имеет ли это смысл?У меня есть ошибки в моем коде, или это просто, как C ведет себя, когда освобождает память для переменной и затем перераспределяет ее?