摘要:
在C语言中,程序可在任意花括号后定义变量,在C++中,允许在程序中任何地方声明变量,它的优点是可在使用该变量附近定义他。当在一个块内定义了一个变量,这个变量的作用域是从定义点起到当前块的结束以及所有在当前块中出现的子块。作用域:变量名有效的范围。生存期:变量在程序中存在的时期(全局,局部两种)。存储方式:auto,register,extern,static存储空间类型:栈(stack):自动分配... 阅读全文
摘要:
在程序设计实践一书中,作者说如下程序会出问题:intmain(){charbuf[20];gets(buf);if(...)}这是因为gets不限制读入数据的长度,所以应当由fgets来代替。这一点本人同意。但是作者有一个观点,本人不能赞同。作者说,如果gets中读入的数据太多,可能会把函数(gets)的返回地址也覆盖。我们都知道,函数的返回地址在栈中,就本程序而言,其在栈中的位置的地址肯定比bu... 阅读全文
摘要:
我想接着讨论一下,如果是数组,那么他与其它变量在栈上是如何分配存储顺序的。我们已经知道,栈是从高地址到低地址生长,而数组是从低地址到高地址生长,那么,这两种不同的生长方式如何相容呢?于是我们设计如下程序。#include"iostream"usingnamespacestd;intmain(){charch1='a';chararr[5];charch2='b';cin>>arr;pr... 阅读全文
摘要:
2)接下来,我们将讨论第二个问题,那就是函数返回值与参数在栈上存放顺序。我们设计如下程序:#include"iostream"usingnamespacestd;inttest(inta,intb){intc;printf("%p\n",&b);//最后一个参数printf("%p\n",&a);//第一个参数printf("%p\n",&c);//函数的返回值地址retu... 阅读全文
摘要:
一直以来,在思考函数调用中,其参数,返回地址的关系。在以前的一篇文章中,也曾看到过这种关系:函数在堆栈中的分布情况是,地址从高到低,依次是:函数参数列表,函数返回地址,函数执行代码段。[1]于是,我进行了测试。我们都知道:在函数内定义的普通变量放在栈上,而只有用malloc,new等申请的内存,才放在堆上。用static标识的变量,和全局变量一样,放在全局存储区。[2]而在栈上存放的变量,一般都是... 阅读全文