在C/C++中,main函数接收类型的参数char*
.
int main(int argc, char* argv[]){
return 0;
}
Run Code Online (Sandbox Code Playgroud)
argv
是一个数组char*
,并指向字符串.这些字符串在哪里?它们是堆,堆栈还是其他地方?
{
char buf[8];
sprintf(buf,"AAAA%3s","XXXXXXXX");
printf("%s\n",buf);
}
Run Code Online (Sandbox Code Playgroud)
会发生什么?
缓冲区有8个字符空间,只剩下3个空闲字符,但"XXXXXXXX"长度为8个字符.
我在Windows 7上使用Visual Studion 2008进行测试.结果,程序打印出来:AAAXXXXXXX,发生了运行时错误.
在Windows中,堆栈实现如下:指定的页面遵循已提交的堆栈页面.它的保护标志是守卫的.因此,当thead引用guared页面上的地址时,内存故障会上升,这会使内存管理器将受保护的页面提交到堆栈并清理页面的防护标志,然后它会保留一个新的页面作为保护.
但是,当我分配一个大小超过一页(4KB)的缓冲区时,没有发生预期的错误.为什么?
我们知道,局部变量位于堆栈上.但是,他们的订单是什么?它们是按照声明的顺序排列的吗?这意味着第一个声明的变量排列在堆栈的较高地址上(堆栈增长到较低的地址)?举个例子:
void foo(){
int iArray[4];
int iVar;
}
Run Code Online (Sandbox Code Playgroud)
在堆栈上,局部变量 - iArray
并按如下iVar
方式排列?