关闭

《C专家编程》:函数如何返回一个数组(九)

标签: 函数返回数组malloccallocrealloc
642人阅读 评论(0) 收藏 举报
分类:

      这节的内容比较少也比较简单,主要是觉得用的很少,所以单独提出来加深印象。主要涉及到函数如何返回一个数组的问题。还有关于内存的分配和扩展基础知识的复习。

一、如何使用指针从函数返回一个数组。

    前几节,我们分析了怎么样把一个数组当参数传递给指针。本小节换个方向讨论数据的转化:从函数返回一个数组。
严格的说,函数无法返回一个数组。但是可以让函数返回一个指向任何数据结构的指针,当然也可以是一个指向数组的指针,记住,声明必须在使用前。一个函数声明的例子如下:
int (*function())[20];

这里function是一个函数,它返回一个指针,该指针指向的是包含20个int类型元素的数组。

返回一数组的具体实现例子如下:

#include <iostream>
#include <stdlib.h>
using namespace std;
int (*function())[20]
{
	int i=0;
	int (*p)[20];//声明一个指向20个元素的指针;
	p=(int(*)[20])calloc(20,sizeof(int));
	//或者p=(int (*)[20])malloc(sizeof(int)*20);
	if(!p)//内存不够;
	{
		cout<<"the memory is not enough!"<<endl;
		return NULL;
	}
	for(i=0;i<20;i++)
		(*p)[i]=i+5;
	return p;
}
int main()
{
	int (*result)[20];
	result=function();
	if(result)
	{
		cout<<(*result)[3]<<endl;//这样访问结果,应该输出8。
		free(result);
	}
	system("pause");
	return 0;
}

运行结果如下:


或者定义这样一个结构体:
struct pp
{
 int arr[20];
}x,y;
struct pp function()  //结构体类型,返回一个结构体对象;
{
   return y;
}
x=y;
x=functoin();
如果要访问一个元素:可以用下面的方法:
x.arr[10]=100;
注意:千万不要返回一个指向函数的局部变量的指针。以前在这里有详细的讲解
函数可以返回的情况有:
(1)返回一个字符串常量;
(2)返回一个静态变量;
(3)返回一个全局变量;
(4)返回一个堆空间地址;
(5)最常用的就是(4)程序员自己申请一个堆区空间保存要返回的变量,然后返回。
二、使用指针创建和使用动态数组
    在很多情况下,我们并不知道数组的长度,而是使用动态数组。绝大多数的语言都支持在运行时设置数组的长度。他们允许程序员计算需要处理的数据的个数,然后申请刚好大小的数组能容纳这些数据。
    数组是静态的,数组的长度在编译期间已经确定不变。在这个领域,C语言支持很弱。你甚至不能用下面的形式:
const int number=10;
int array[number];//编译出错,期待一个整形常量表达式。
但是这样的语句在C++中是合法的。
1、现在我们来看一下如何实现动态数组,比较简单!
它的基本思路就是使用malloc()库函数来得到一大块内存的指针。然后,像引用数组一样引用这块内存,其机理就是一个数组下标访问可以改写一个指针加上偏移量。
具体代码实现如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
	int number;
	int *arr=NULL;
	int i=0;
	printf("please input the number of your array:\n");
	scanf("%d",&number);//根据具体的个数分配动态空间。
	arr=(int *)malloc(sizeof(int)*number);
	for(i=0;i<number;i++)
		arr[i]=i+5;
	for(i=0;i<number;i++)
		printf("%d-",arr[i]);
	printf("\n");
	system("pause");
	return 0;
}

输入5,运行结果:


     动态数组对于避免预定义的限制也是非常有用的。这样既可以避免空间的浪费,也可以避免内存不够用的尴尬。方便了程序员,但是一定要记住释放申请的内存,,不然会造成内存的泄漏(leak memeory)。

2、内存的扩展realloc()函数,比较简单,不要是为了练手,可能有些冗余,复习的时候可以跳过。

代码实现如下:

#include <stdio.h>
#include <stdlib.h>
int current_element=0;
int total_element=3;
char *arr=NULL;
void add_element(char c)
{
	if(current_element==total_element-1)
	{
		total_element*=2;
		arr=(char *)realloc(arr,total_element);
		if(NULL==arr)
		{
			printf("the memory is not enough!\n");
			return ;
		}
		else
		{
			printf("realloc successfully!\n");
		}
	}
	arr[current_element++]=c;
}
int main()
{
	int number;
	int i=0;
	char *add="ky";
	char array[10]="abcdefghi";
	arr=(char *)malloc(total_element);
	while(current_element < total_element-1)
		arr[current_element++]=array[i++];
	add_element(add[0]);
	add_element(add[1]);
	printf("\n");
	i=0;
	while(i<current_element)
		printf("%c-",arr[i++]);
	printf("\n");
	free(arr);
	system("pause");
	return 0;
}
运行结果:
     在笔记(八)里面用到了一个calloc(n,sizeof(value))函数,它和malloc(size)类似,但是它有两个参数,一个是变量的大小,一个是变量的个数,返回值是n个变量value的大小空间的首地址。主要适合用于数组指针的申请内存空间。
例如:
int (*p)[5];//p指向的是一个有5个int元素的内存空间;
p=(int (*)[5])calloc(5,sizeof(int));
................................

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:257704次
    • 积分:5544
    • 等级:
    • 排名:第4950名
    • 原创:252篇
    • 转载:17篇
    • 译文:0篇
    • 评论:49条
    博客专栏
    Keep going~
    时间不会因为你的迷茫而停留;
    生活不会因为你的惆怅而改变;
    即使此刻:
    不知有多少人仍在不停的翻动着书页......
    联系
    最新评论