程序:
#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:
mohanraj@ltsp63:~/Development/chap8$ strace -e sbrk ./a.out
strace: invalid system call `sbrk'
mohanraj@ltsp63:~/Development/chap8$
输出 2:
mohanraj@ltsp63:~/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
mohanraj@ltsp63:~/Development/chap8$
疑问:
Malloc 函数使用 sbrk 系统调用在堆中分配内存。这里程序中断在调用malloc之后也发生了变化。
但是,输出仅显示 brk 系统调用。 strace 命令抛出错误,因为“sbrk 是无效的系统调用”。那么,内存怎么样
使用malloc分配?
但是,调用 malloc 语句后,输出显示以下行“brk(0x83a1000)”。在这里,为什么brk 值已更改,为什么 sbrk 未打印在输出上?
最佳答案
我认为,只有在第一次调用 malloc() 之后才会创建堆。 到那时我们就不需要堆了。 这就是为什么在第一次 malloc() 调用之后,您会看到对“brk(0x83a1000)”的调用。
关于c - Unix 中的 Strace 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31260349/