C语⾔函数如何返回数组
⽂章⽬录
提⽰:以下是本篇⽂章正⽂内容,下⾯案例可供参考
⼀、静态数组和动态数组
1.静态数组的缺点
1.数组长度必须事先制定,不能为变量,必须为常整数;
2.传统定义的数组,其内存⽆法被程序员⼿动释放。在函数运⾏期间,系统为其分配的内存⼀直存在,直到函数运⾏结束,其内存被系统⾃动释放;
3.数组的长度⼀定固定,将⽆法改变。数组的长度⽆法在函数运⾏的过程扩⼤或缩⼩;
4.传统的定义的数组⽆法跨函数使⽤;
2.动态内存分配与动态数组
2.1 动态内存分配
我们知道,C语⾔中构造⼀个静态整型数组可以表⽰为 int a[5];,但如果获得动态整型数组直接写成int a[len]是不对的,那么如何构造动态的长度可以选定的数组?就这需要动态内存分配。
在C 语⾔中通过库函数malloc分配所需的内存空间,并返回⼀个指向它的指针。此函数的返回值是⼀个指针,指向分配空间的第⼀个字节的地址,所以该函数是⼀个指针型函数。
malloc声明: void *malloc(size_t size)
代码如下(⽰例1):
#include<stdlib.h>
malloc(100)//开辟100字节的动态内存,返回第⼀个字节的地址
2.2 动态数组
上⾯⽰例中:malloc(100)返回动态内存的100个字节中的第⼀个字节的地址即返回的指针指向动态内存的第⼀个字节。我们想要构造⼀个整型数组,通常整型数组的元素是4个字节即整型数组名指向4个字节,⽽malloc的返回的值指向的是1个字节,显然直接使⽤malloc函数是⽆法直接构造⼀个整形数组,那么如何解决?
注意到malloc函数的声明指出其返回的指针的基类型是void,即不指向任何类型的数据,只提供⼀个纯地址。所以我们可以更改基类型,若要构造动态整型数组,则将基类型更改为int,即(int *)malloc(100),此时malloc 函数的返回值指向4个字节(见⽰例2);若要构造动态浮点型数组,则将基类型更改为float,即(float *)malloc(100),此时malloc 函数的返回值指向8个字节;
代码如下(⽰例2):
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int len;
int* pArr;
printf("请输⼊数组的长度:\n");
scanf("%d",&len);
pArr =(int*)malloc(sizeof(int)* len);
free(pArr);//⼿动释放程序员⼿动分配的内存
return0;
}
//此函数实现了动态数组的构造
//pArr = (int *)malloc(sizeof(int) * len);相当于 int pArr[len];(只是起到等价的作⽤,这样写C语⾔中是不⽀持的)
2.3 内存与堆与栈
静态内存是栈中分配,动态内存是在堆中分配。
⼆、⾃定义函数返回数组
1.常见错误
代码如下(⽰例3):
int*Input(void)
{
int a[10];
return a;
}
该函数为指针型函数。其定义静态数组并返回,由于静态数组(局部变量)在函数运⾏期间,系统为其分配的内存⼀直存在,直到函数运⾏结束,其内存被系统⾃动释放,所以我们⽆法接收这个数组.在Xcode中会得到下图的警告,所以我们使⽤这样的做法接收返回的数组。
2.返回数组的函数
动态开辟内存在堆区,堆区不像中静态数组(局部变量)在栈区存储,系统根据它的⽣命周期⾃动收
回,⽽是⼿动开辟,⼿动释放,这样就可以完全规避问题,具体实例如下:
代码如下(⽰例4):
int*Input(void)
{
int*a =NULL;
int*p;
a =(int*)realloc(a,sizeof(int)*10);
for(p=a;p<a+10;p++)
{
scanf("%d",p);
}
return a;
}
需要注意的是:记得⽤完free掉,防⽌内存泄露!
molloc函数三. 总结
C语⾔中通过堆区动态开辟内存解决函数的返回数组问题:我们通常⽤malloc来在堆区动态开辟内存,利⽤堆区“现⽤现开辟,⽤完⼿动收回”特点,实现灵活管理。
四. 参考
1.郝斌C语⾔教程
2.谭浩强《C程序设计》
3.CSDN :C语⾔⾃定义函数如何返回数组
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论