C语言自定函数内定义一维数组,为什么不能将数组名作为返回值?

如果说函数调用结束时 函数内定义的数组的存储单元会被释放掉 导致数组首地址丢失而不能返回的话 那么。。若自定函数内int i=3;那因为函数调用结束时i的存储单元已经被释放掉了 所以就不能return i;了吗?这明显不对啊

并不是一定不能返回,而是要区分定义的一维数组类型。
1 当一维数组为静态类型时,即
static type var[N];
的形式,这时是可以将数组名返回的。

2 当一维数组不是静态类型,即不存在static修饰时,数组为局部变量,这时不能将数组名返回。

当把数组名返回时,实际上是返回了数组的首地址,后续继续使用该地址指向的内存。如果数组为局部变量,那么按照C语言的规则,该段地址在退出函数后,会被释放,并可能被系统做其它用途,这样再继续访问该段地址就会引起不可预知错误。所以对于局部数组名是不可以返回的。
而静态局部变量,开辟的空间不会在退出函数后释放,这时可以返回。
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2016-02-02
lz问题有问题。
是可以讲数组名作为返回值返回的,我想你是编程时写的有问题或者是老师讲的死规定才会提出这个错误的问题。
数组名就是一个地址常量,怎么可能不可以作为返回值返回主调函数呢?
只是若你在被调函数中定义数组,然后将这个被调函数中定义的数组名作为函数值返回是没有意义的。因为被调函数在调用结束之后,原来在被调函数中定义的数组空间就被释放掉了,成了"垃圾内存",你再在主调函数中使用这段地址又有什么意义呢?
所以,不是不能,而是没有意义。本回答被提问者采纳
第2个回答  2012-12-17
对于数组,你返回数组名就是返回地址,而这个地址会在函数结束的时候释放,当然不行(你硬要这么做也没问题,只是返回的那段地址里面的东西是什么就没人知道了)
对于int,返回的只是一个值,如你上面,返回的只是3这个数字,与i无关
第3个回答  2012-12-17
首先数组的存储单元被释放是在return之前的,return完再释放内存。所以调用该函数是能收到return返回的值的,但你要注意两个返回值的区别:数组返回的是地址,我们收到的是它的地址,但我们真正要的是地址上的值,那个值已被释放 了,所以在这个地址上找不到该值,而整形i返回的就是一个值,尽管他也被释放了,但在释放之前他返回了。追问

释放存储单元和释放内存。。是两回事吗?

追答

都说的一样意思

第4个回答  2012-12-17
这个return i是把i的值返回出去 而不是返回给函数内部的变量 int i

例如

int fun()
{
int i =3;
.......
return i
}

用main或者其他调用时

int ret = fun()

那个return i是把值 返回到这个ret的 不是fun里的int i ,你明白了吗本回答被网友采纳

C语言中,整个数组可以作为函数的返回值吗?
不行,C++中 数组和枚举都是不可以作为函数的返回类型来返回的,假如您想要实现返回数组,您可以声明一个结构,里面包含数组或者枚举类型,然后返货这个结构类型或者指针 曾经有本很经典的书就笑谈到(貌似是《C++primer puls》):C和C++不允许返回数组却可以返货带数组的结构体,这不是自己打自己巴掌么...

请问在C语言中数组可以作为返回值吗
返回数组是不行的(用malloc分配倒是可以但不安全),但你的要求却可以达到,那就是用指针 比如,输入a,返回b和c:void fun(int a, int *pb, int *pc){ pb = a - 1;pc = a + 1;} int main(){ int a = 1;int b, c;fun(a, &b, &c);\/\/输入a返回b=a-1,c=a+1两个结...

C语言能直接用一个数组名对数组进行赋值吗
回答:不可以,在int a[];时已经为数组在内存中开辟了空间,就是数组a和b的地址已经定下了,在C中,数组一旦在内存中被创建是是固定不变的,直到被取消,a=b,把b的地址给a是不行的。

c语言中函数返回值可以是数组、字符串和结构体吗?
1、ANSI C语言标准,明确规定 数组类型和函数类型不可以做为返回值。解决这种返回值的方法是通过指针来间接返回,即使用数组指针和函数指针。这可以做为c语言引入指针的另一个理由。2、字符串是数组的一种,是字符数组,所以同样不可以作为返回值。3、结构体类型可以做为返回值,C语言设计者当时引入str...

为什么c语言中,数组名是一个地址常量,不能对它进行赋值运算
在最终的汇编结果中,数组名只是一个标号,对应一个地址,在程序中使用数组就是要替换成这个起始地址,因此作为标号本身是不可以修改的,也不是一个变量。用数组名进行计算就是用数组起始地址计算,但不可以给数组名重新赋值

请问在C语言中数组可以作为返回值吗
返回数组是不行的(用malloc分配倒是可以但不安全),但你的要求却可以达到,那就是用指针 比如,输入a,返回b和c:void fun(int a,int pb,int pc){ pb = a - 1;pc = a + 1;} int main(){ int a = 1;int b,c;fun(a,&b,&c);\/\/输入a返回b=a-1,c=a+1两个结果 printf(...

C语言中,我在函数内部定义了一个新的数组,如何将计算后存于该数组的值...
办法有二:1. 函数内部新数组定义为static,这样可以直接把这个数组返回出来;2. 在函数内部把新数组的内容拷贝到外部数组里。

C语言数组名可以赋值吗?
C语言中,数组名是一个不可变的指针常量,不能对它进行加、减和赋值运算。在C语言中规定,数组名是代表该数组的首地址且符合标识符书写规定的变量标识符。不能对它进行加、减和赋值运算。整个数组是以首地址开头的一块连续的内存单元。如有字符数组char c[10],设数组c的首地址为2000,也就是说c...

c语言中在一个自定义函数中怎么返回两个值?
方法二:如果用数组名作为形参,那么改变数组内容,比如排序,或者进行加减运算,回到实参时依然是有效的。这样也会返回一组值。方法三:可以利用指针变量,这个原理和方法二是一样的,因为数组名本身就是数组首元素的地址。就不多说了。 用结构体封装不同类型数据,或者用数组表示同类型数据,然后返回...

为何函数不能返回值?
c语言规定,函数返回值的类型是由函数首部定义的类型决定。函数返回值应与首部定义的类型一致,如若不一致,则自动将返回值强制转换为函数首部定义的类型。没有定义类型时默认为int型。也就是说你的函数是什么类型,返回值就是什么类型。比如:函数定义 int fun(int a,char b)返回值就是整型 函数定义 ...

相似回答