//函数调用数组
#include <stdio.h>
#include <stdlib.h>
#define N 8
//指针函数
int* creat()
{
int arr[N];
int i;
printf("creat()函数中产生数组元素\n");
for( i = 0; i < N; i++)
{
arr[i]=rand() % 100;
printf("%d\t",arr[i]);
}
return arr;
}
void print3(int arr[], int n)
{
int i;
for( i = 0; i < N; i++)
{
printf("%d\t",arr[i]);
}
}
int main(void)
{
int *p;
p=creat();
printf("\n通过函数调用返回后得到的数组\n");
print3(p,N);
getchar();
return 0;
}
但运行结果(如下图)并没有成功的返回我想要的元素,这是因为creat()函数中定义的数组arr在creat()函数调用后被释放掉了,
所以不可能得到正确的结果,数组的生存周期随着函数的调用的结束而结束了,那么有什么办法从数组中成功的返回一个
数组呢?那就想办是数组在函数调用结束后不被释放,实现方法有以下两种。
第一种,将数组定义为静态数组,在数组声明前面加上static
//函数调用数组
#include <stdio.h>
#include <stdlib.h>
#define N 8
//指针函数
int* creat()
{
static int arr[N];
int i;
printf("creat()函数中产生数组元素\n");
for( i = 0; i < N; i++)
{
arr[i]=rand() % 100;
printf("%d\t",arr[i]);
}
return arr;
}
void print3(int arr[], int n)
{
int i;
for( i = 0; i < N; i++)
{
printf("%d\t",arr[i]);
}
}
int main(void)
{
int *p;
p=creat();
printf("\n通过函数调用返回后得到的数组\n");
print3(p,N);
getchar();
return 0;
}
静态数组成功返回数组,这是因为静态数组的生存周期是从诚寻开始运行到结束的,而不像普通数组那样伴随着函数调用的结束而结束其生命周期,所以数组不会随着函数调用的结束而被释放掉。
申请一个动态数组,也可以让数组作为参数在不同函数间使用。
#include <stdio.h>
#include <stdlib.h>
#define N 8
static int* creat()
{
int i;
int* arr=(int *)malloc(sizeof(int *)*N);
printf("creat()函数产生数组元素\n");
for(i = 0; i < N; i++)
{
arr[i]=rand() %100;
printf("%d\t",arr[i]);
}
printf("\n");
return arr;
}
static void sort (int arr[],int n)
{
int i,j;
int temp;
int flag;
for(i = 0;i < n-1;i++)
{
flag = 1;
for( j = 0;j < n-i-1 ; j++)
{
if( arr[j] > arr[j+1] )
{
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
flag=0;
}
}
}
return ;
}
static void print( int arr[],int n)
{
int i;
for( i = 0; i < N ;i++)
{
printf("%d\t",arr[i]);
}
}
int main(void)
{
int i;
int *p;
p=creat();
sort(p,N);
printf("\n通过函数调用返回进行排序后的数组\n");
print(p,N);
free(p);
getchar();
return 0;
}
运行结果
采用这种方式也可以的得到正确的结果,只是这个时候要注意main()函数中采用free()函数进行内存释放时,
不能使用arr作为参数,因为尽管为它申请的内存空间是从程序的开始到结束,但是并不是一个全局变量。在main()
函数中使用指针p指向了内存单元的首地址,所以可以采用指针变量p作为free()函数的参数对申请的内存空间释放。
参考图书:《C语言进阶》