программы:Начальный размер динамической памяти для программы
#include<stdio.h>
#include<sys/types.h>
#include<malloc.h>
main()
{
int *i1, *i2;
char *s;
printf("sbrk(0) before malloc(4): %x\n", sbrk(0));
i1 = (int *) malloc(sizeof(int));
printf("sbrk(0) after `i1 = (int *) malloc(4)': %x\n", sbrk(0));
i2 = (int *) malloc(sizeof(int));
printf("sbrk(0) after `i2 = (int *) malloc(4)': %x\n", sbrk(0));
}
Выход:
sbrk(0) before malloc(4): a027000
sbrk(0) after `i1 = (int *) malloc(4)': a048000
sbrk(0) after `i2 = (int *) malloc(4)': a048000
что начальный размер кучи памяти для указанной программы. Я думаю, на начальном этапе программы начальный и конечный адреса кучи такие же. Однажды мы называем malloc, он выделяет память с помощью sbrk.
Вышеупомянутая программа показывает, что сначала sbrk (0) возвращает a027000 в качестве разрыва программы. После выполнения инструкции malloc разрыв программы изменяется на a048000. Он показывает, что до вызова malloc куча не имеет достаточного количества памяти. Таким образом, только перерыв программы изменяется после вызова malloc. При начальном состоянии , если в куче было достаточно памяти, нет необходимости изменять разрыв программы. Поэтому сначала размер кучи равен нулю. Это правильно?
Хороший ответ зависит от архитектуры - пожалуйста, сообщите нам свою ОС и оборудование. В зависимости от вашей ОС у вас, вероятно, есть своего рода трассировка - вы можете запустить свою программу под трассировкой. Вероятно, вы увидите вызовы в семействе системных вызовов brk() как часть запуска. malloc использует биннинг кучи на некоторых системах - это означает, что у него есть свой кусок кучи, отдельный от libc. –
Ваши 'printf()' -специалисты ошибочны. '% x' ожидает аргумент типа' unsigned int', а 'sbrk()' возвращает 'void *'. – EOF
Вам также необходимо определить, когда должен измеряться «начальный» размер. До того, как будет вызван вызов 'main()', может выполняться бит кода. –