C语言自定函数内定义一维数组,为什么不能将数组名作为返回值?
如果说函数调用结束时函数内定义的数组的存储单元会被释放掉导致数组首地址丢失而不能返回的话那么。。若自定函数内inti=3;那因为函数调用结束时i的存储单元已经被释放掉了所...
如果说函数调用结束时 函数内定义的数组的存储单元会被释放掉 导致数组首地址丢失而不能返回的话 那么。。若自定函数内int i=3;那因为函数调用结束时i的存储单元已经被释放掉了 所以就不能return i;了吗?这明显不对啊
展开
8个回答
展开全部
并不是一定不能返回,而是要区分定义的一维数组类型。
1 当一维数组为静态类型时,即
static type var[N];
的形式,这时是可以将数组名返回的。
2 当一维数组不是静态类型,即不存在static修饰时,数组为局部变量,这时不能将数组名返回。
当把数组名返回时,实际上是返回了数组的首地址,后续继续使用该地址指向的内存。如果数组为局部变量,那么按照C语言的规则,该段地址在退出函数后,会被释放,并可能被系统做其它用途,这样再继续访问该段地址就会引起不可预知错误。所以对于局部数组名是不可以返回的。
而静态局部变量,开辟的空间不会在退出函数后释放,这时可以返回。
1 当一维数组为静态类型时,即
static type var[N];
的形式,这时是可以将数组名返回的。
2 当一维数组不是静态类型,即不存在static修饰时,数组为局部变量,这时不能将数组名返回。
当把数组名返回时,实际上是返回了数组的首地址,后续继续使用该地址指向的内存。如果数组为局部变量,那么按照C语言的规则,该段地址在退出函数后,会被释放,并可能被系统做其它用途,这样再继续访问该段地址就会引起不可预知错误。所以对于局部数组名是不可以返回的。
而静态局部变量,开辟的空间不会在退出函数后释放,这时可以返回。
展开全部
lz问题有问题。
是可以讲数组名作为返回值返回的,我想你是编程时写的有问题或者是老师讲的死规定才会提出这个错误的问题。
数组名就是一个地址常量,怎么可能不可以作为返回值返回主调函数呢?
只是若你在被调函数中定义数组,然后将这个被调函数中定义的数组名作为函数值返回是没有意义的。因为被调函数在调用结束之后,原来在被调函数中定义的数组空间就被释放掉了,成了"垃圾内存",你再在主调函数中使用这段地址又有什么意义呢?
所以,不是不能,而是没有意义。
是可以讲数组名作为返回值返回的,我想你是编程时写的有问题或者是老师讲的死规定才会提出这个错误的问题。
数组名就是一个地址常量,怎么可能不可以作为返回值返回主调函数呢?
只是若你在被调函数中定义数组,然后将这个被调函数中定义的数组名作为函数值返回是没有意义的。因为被调函数在调用结束之后,原来在被调函数中定义的数组空间就被释放掉了,成了"垃圾内存",你再在主调函数中使用这段地址又有什么意义呢?
所以,不是不能,而是没有意义。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
对于数组,你返回数组名就是返回地址,而这个地址会在函数结束的时候释放,当然不行(你硬要这么做也没问题,只是返回的那段地址里面的东西是什么就没人知道了)
对于int,返回的只是一个值,如你上面,返回的只是3这个数字,与i无关
对于int,返回的只是一个值,如你上面,返回的只是3这个数字,与i无关
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先数组的存储单元被释放是在return之前的,return完再释放内存。所以调用该函数是能收到return返回的值的,但你要注意两个返回值的区别:数组返回的是地址,我们收到的是它的地址,但我们真正要的是地址上的值,那个值已被释放 了,所以在这个地址上找不到该值,而整形i返回的就是一个值,尽管他也被释放了,但在释放之前他返回了。
追问
释放存储单元和释放内存。。是两回事吗?
追答
都说的一样意思
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个return i是把i的值返回出去 而不是返回给函数内部的变量 int i
例如
int fun()
{
int i =3;
.......
return i
}
用main或者其他调用时
int ret = fun()
那个return i是把值 返回到这个ret的 不是fun里的int i ,你明白了吗
例如
int fun()
{
int i =3;
.......
return i
}
用main或者其他调用时
int ret = fun()
那个return i是把值 返回到这个ret的 不是fun里的int i ,你明白了吗
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询