所以这个数组是局部数组,进入函数时创建,函数结束时撤销。
这个程序编译时一般会有警告——你返回了一个已撤销的数组的起始地址。
打个比方:你在旅馆里开了5间房,并把第一间房的房号作为函数值。
函数结束时,退了房,但房号(即地址)还是在的,但那房间却不属于你的了。
如果没有新人入住,那么里面的内容就没变。一旦新人入住,那么里面的内容就会改变。
直接看第二个程序:
1) pArr = staticArr()
2) printf("%d\n", *(pArr + 1))
3) printf("%d\n", *(pArr + 2))
第1行:pArr得到了已撤销的数组的起始地址。
第2行:调用printf函数之前,首先通过*(pArr+1)获取了这个已撤销数组的第一个元素的值,由于房间还没新人入住,所以可以得到原来的值。接着,就把这个值传给printf函数,注意它是复制了一份再发给printf函数的。
注意:所有函数在调用时所给出的实际参数都将被复制给被调函数的形式参数的——即函数的形式参数都是复制品。
现在调用printf函数——新人入住了,那个数组的房间现在分配给printf函数去用了,其中内容被改变,但是printf函数输出的是复制品,不是原件,所以“看起来没变”。
第3行:再次通过*(pArr + 2)取值的时候,就取到了被前一个printf函数改变以后留下的垃圾值,而且这个printf函数将再次改变这些房间,留下不同的垃圾值。
用任何方法输出这个已经不属于你的数组的内容,都是毫无意义的,因为它都是前一个printf函数结束工作后留下的垃圾数据。
如果你在数组定义前加static关键字,结果就不同了。
static int a[5] = {...}
不信,你就试一试!
变量用delete释放,数组用delete[]释放,指针的类型不能改变。对于一些简单的情况(所有成员都是基本数据类型,没有析构函数),可以直接用delete释放。
例:
structNODE
{
intidata
doubleddata
}node[100]
//释放空间
delete[]node
//所有的数组类型释放空间都这样写
扩展资料
C语言数组
数组的声明并不是声明一个个单独的变量,比如number0、number1、...、number99,而是声明一个数组变量,比如numbers,然后使用numbers[0]、numbers[1]、...、numbers[99]来代表一个个单独的变量。数组中的特定元素可以通过索引访问。
所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)