|
本帖最后由 ztrx 于 2017-3-17 18:14 编辑
C语言入门之返回函数里的数组
我们首先要写个函数,在函数里先定义个数,返回这个数组,调用这个函数。我们先这样写:
- #include<stdio.h>
- int * fun ( void )
- {
- int arr[10];
- arr[0] = 10;
- arr[1] = 20;
- return arr;
- }
- int main()
- {
- int * ptr = fun();
- printf ( "%d,%d\n", ptr[0] , ptr[1] );
- return 0;
- }
复制代码
输出:10,20 ,似乎我们已经成功了。别着急,我们再加一行代码:
- int main()
- {
- int * ptr = fun();
- printf ( "%d,%d\n", ptr[0] , ptr[1] );
- printf ( "%d,%d\n", ptr[0] , ptr[1] );
- return 0;
- }
复制代码 编译运行,输出:
怎么两行的输出不一样,问题出在哪里?我们先分析下这个函数int * fun ( void ),返回值是个指针,指向函数内arr数组,调用这个函数int * ptr = fun(); ptr就指向arr数组。arr数组是个局部变量,我们知道,局部变量作用域仅限于自身所在的函数内部,出界便无效。所以使用这种方法是错误的。
那么我们应该怎么写这个函数呢?
第一种方法,使用静态变量:
把数组定义在函数外(全局变量)或者加static修饰,调用函数结束时,静态存储变量不消失并且保留原值。
- int * fun ( void )
- {
- static int arr[10];
- arr[0] = 10;
- arr[1] = 20;
- return arr;
- }
复制代码
输出:
第二种方法,使用结构体:
定义一个结构体,把这个数组放在这个结构体里。函数返回类型为结构体。
- #include<stdio.h>
- typedef struct St
- {
- int arr[10];
- } Sarr;
- Sarr fun ( void )
- {
- Sarr a;
- a.arr[0] = 10;
- a.arr[1] = 20;
- return a;
- }
- int main()
- {
- Sarr a = fun();
- printf ( "%d,%d\n", a.arr[0] , a.arr[1] );
- printf ( "%d,%d\n", a.arr[0], a.arr[1] );
- return 0;
- }
复制代码
输出:
第三种方法,使用malloc:
- #include<stdio.h>
- #include<stdlib.h>
- int * fun()
- {
- int * arr = malloc ( 10 * sizeof ( int ) );
- arr[0] = 10;
- arr[1] = 20;
- return arr;
- }
- int main()
- {
- int * ptr = fun();
- printf ( "%d,%d\n", ptr[0] , ptr[1] );
- printf ( "%d,%d\n", ptr[0] , ptr[1] );
- free ( ptr );
- return 0;
- }
复制代码
输出:
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|