我正在使用 malloced 内存和局部变量来查看堆栈和堆如何增长。据我了解,堆向上增长,堆栈向下增长。使用 malloc 分配的所有内存都在堆中分配,局部变量在函数的堆栈中分配。
在以下程序中:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 999999999
void tot(){
static int c =0;
int k;
c++;
int *pp = malloc(sizeof(int) * SIZE);
if(pp==NULL){
fprintf(stderr,"NO memory allocated after call : %d\n",c);
return;
}
printf("%p %d %p\n",&k,c,pp);
tot();
}
int main(int argc, char *argv[]){
int k;
int *pp = malloc(sizeof(int) * 99999);
if(pp ==NULL){
fprintf(stderr,"No memory allocated\n");
return;
}
printf("%p %p\n",&k,pp);
tot();
return 0;
}
我在函数 tot() 中创建了一个局部变量,它将是 4 个字节和一个 int* 类型的指针变量,这会将每次调用的总堆栈大小增加到略大于 4 个字节。我还使用 malloc 分配了一些内存,并将分配的内存分配给本地指针变量。由于这个 malloced 内存是在堆上分配的,因此堆栈大小应该仍然超过 4 个字节,但根据我在上述程序中的观察,堆栈大小增加了很多。经过大量数学计算后,我发现堆栈帧包括在每个函数调用中创建的分配内存。
虽然删除线
int *pp = (int*)malloc(sizeof(int) * SIZE);
它负责在每个函数调用中分配这么大的内存,将堆栈帧大小减少到 ~4 字节,这非常好。
不过,在这两种情况下,堆栈框架都在向下增长。
为什么我得到这样的输出。我认为在堆上分配动态内存是错误的。为什么 malloced 内存会增加堆栈帧的大小?
编辑:我还尝试通过将指向在一个堆栈帧中分配的内存的指针传递给另一个函数调用(另一个堆栈帧)来访问在另一个堆栈帧中的一个堆栈帧中分配的内存,以便在一个帧中分配的内存可以用于其他调用只是为了验证编译器是否没有在内部将 malloc 转换为 alloca(这可能是大堆栈帧的原因),但这没有任何区别。结果还是一样。