可能问题很简单,但我想知道当我这样做时到底发生了什么:
int arr [10];
更具体的问题: 我知道这是一个静态内存分配,但它在哪里监视内存的哪一部分被占用? 谢谢。
答案 0 :(得分:1)
我会解决正常的做法,而不是理论 -
这取决于你把
放在哪里int arr[10];
如果你把put放在一个函数中,那将导致类似:
SUB#40,SP
从堆栈指针寄存器中减去40(假设4字节整数)。
& arr然后== SP
假设arr是唯一的变量分配。通常,所有分配都是一步完成的。然后,结果变量将从堆栈指针偏移。
如果将定义放在函数之外,编译器和链接器将为需求零内存页面创建一个程序部分。程序运行时,加载程序会设置页面,第一个引用会触发操作系统将通过创建清零内存页面来响应的页面错误。
答案 1 :(得分:0)
如果在函数内部,这将在当前堆栈帧上分配,以便在该函数返回时可以回收它。
如果全局声明,则在堆中分配,不需要"监视"。
答案 2 :(得分:0)
该情况下的内存分配在堆栈内存中。 正如其名称所示,堆栈内存可用作堆栈:后进先出。
例如:当你调用一个函数时,函数框到达执行的顶部,并在框架的堆栈中分配你需要的内存。 退出函数时,所有与函数相关的内容(包括堆栈变量)都将被销毁。 这就是为什么如果你试图在其函数之外访问堆栈变量的地址,你将会变成垃圾。
您可以在维基百科文章中看到有关基于堆栈的内存分配的更多详细信息:http://en.wikipedia.org/wiki/Stack-based_memory_allocation
答案 3 :(得分:0)
变量arr应该在堆栈中分配,就像将此行放在函数中一样。如果将此行放在全局区域中,则此变量将位于堆中的数据段中,但仍与常规堆不同。普通堆意味着我们使用new / malloc来分配内存。
以下示例说明如何在普通堆中分配内存:
int * pInt =(int *)malloc(10 * sizeof(int));