программы:команда Strace в Unix
#include<stdio.h>
#include<sys/types.h>
#include<malloc.h>
main()
{
int *i1, *i2;
printf("sbrk(0) before malloc(): %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));
}
Выход 1:
[email protected]:~/Development/chap8$ strace -e sbrk ./a.out
strace: invalid system call `sbrk'
[email protected]:~/Development/chap8$
Выход 2:
[email protected]:~/Development/chap8$ strace -e brk ./a.out
brk(0) = 0x8380000
brk(0) = 0x8380000
sbrk(0) before malloc(4): 8380000
brk(0x83a1000) = 0x83a1000
sbrk(0) after `i1 = (int *) malloc(4)': 83a1000
sbrk(0) after `i2 = (int *) malloc(4)': 83a1000
[email protected]:~/Development/chap8$
Сомнения:
Функция Malloc выделяет память в куче, используя системный вызов sbrk. Здесь также прерывается программа после вызова malloc.
Но на выходе отображается только системный вызов brk. Команда strace выдает ошибку, поскольку «sbrk - это неверный системный вызов». Затем, как память
выделено с использованием malloc?
Но после вызова инструкции malloc на выходе отображается следующая строка «brk (0x83a1000)». Здесь, почему значение brk изменяется и почему sbrk не печатается на выходе?
offtopic: используйте 'int main (void)' и 'return 0;' –
Большинство 'malloc' используют' mmap'. Рассмотрите 'sbrk' как устаревший syscall (например, потому что он является недружественным потоком). –
Offtopic 2: Пожалуйста, [см. Почему не делать] (http://stackoverflow.com/q/605845/2173917) возвращаемое значение' malloc() 'и семью в' C'. –