小编rem*_*inn的帖子

C/C++主函数的参数在哪里?

在C/C++中,main函数接收类型的参数char*.

int main(int argc, char* argv[]){
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

argv是一个数组char*,并指向字符串.这些字符串在哪里?它们是堆,堆栈还是其他地方?

c c++ parameters location program-entry-point

58
推荐指数
4
解决办法
2万
查看次数

sprintf函数的缓冲区溢出?

{     
    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,发生了运行时错误.

c printf overflow fortify-source

11
推荐指数
4
解决办法
3万
查看次数

7
推荐指数
1
解决办法
1万
查看次数

在堆栈上分配更多页面大小的缓冲区会破坏内存吗?

在Windows中,堆栈实现如下:指定的页面遵循已提交的堆栈页面.它的保护标志是守卫的.因此,当thead引用guared页面上的地址时,内存故障会上升,这会使内存管理器将受保护的页面提交到堆栈并清理页面的防护标志,然后它会保留一个新的页面作为保护.

但是,当我分配一个大小超过一页(4KB)的缓冲区时,没有发生预期的错误.为什么?

windows size stack memory-management

6
推荐指数
1
解决办法
835
查看次数

编译器如何在堆栈上安排局部变量?

我们知道,局部变量位于堆栈上.但是,他们的订单是什么?它们是按照声明的顺序排列的吗?这意味着第一个声明的变量排列在堆栈的较高地址上(堆栈增长到较低的地址)?举个例子:

void foo(){
 int iArray[4];
 int iVar;
}
Run Code Online (Sandbox Code Playgroud)

在堆栈上,局部变量 - iArray并按如下iVar方式排列?

替代文字

variables stack

2
推荐指数
1
解决办法
1835
查看次数