动态数组-C语言


动态数组:将指针与动态内存分配函数联用。
动态内存分配:在程序运行时为变量分配内存的一种方法。
C语言的动态内存分配函数从堆上分配内存,只用这些函数的时候需要将头文件<stdlib.h>包含到源程序中。

1、malloc()函数

函数原型:void *malloc(unsigned int size);

malloc()函数用于分配若干字节的内存空间,返回一个指向该内存首地址的指针。若系统不能够提供足够的内存单元,函数会返回空指针NULL。

size:向系统申请空间的大小,函数调用成功会返回一个指向void类型的指针。

void *:常用来说明其基本类型未知的指针。如果要将函数调用的返回值赋给某个指针,就需要用强制类型转换将返回的指针转为所需要的类型,然后再进行赋值操作。
例:

int *p = NULL;
p = (int *)malloc(10);

不同的类型在不同的编译器、系统下面在内存中会占有不同的字节数,所以我们一般会采用sizeof()来计算本系统中该类型所占內存的字数,然后才用malloc()向系统申请相应字节数的储存空间。
例:p = (int *)malloc(10*sizeof(int));

2、calloc()函数

函数原型:void *calloc(unsigned int num,unsigned int size);

calloc()函数用于给若干同一类型的数据项分配连续的储存空间并赋值为0;相当于声明了一个一维数组;数组返回值为数组首地址;

num:表示向系统申请的内存空间的数量,决定了一位数组的大小
size:表示申请的每个空间的字节数,确定了元素类型

如果要将函数调用的返回值赋给某个指针,就需要用强制类型转换将返回的指针转为所需要的类型,然后再进行赋值操作;
例:

int *p = NULL:
p = (int *)calloc(10,sizeof(int));

相当于
int p = (int *)mcalloc(10*sizeof(int));

calloc()比malloc()更加安全,因为calloc()函数能自动将内存初始化为0

3、free()函数

函数原型:void free(void *p);

free()函数是释放向系统动态申请的储存空间;
p只能是由malloc()和calloc()申请内存时返回的地址;
例:free(p);

4、realloc()函数

函数原型:void *realloc(void *p,unsinged int size);

realloc()函数用于改变原来分配的储存空间的大小;
将原来p指向的储存空间的大小改为size个字节,返回新分配的储存空间的首地址,与原分配的首地址不一定相同。
例:realloc(p,15);

5、例

例:

#include <stdio.h>
#include <stdlib.h>											  //头文件																

double aver(int *p,int num){
	int sum = 0;
	for(int i = 0;i < num;i++){
		printf("输入%d个数字:",i+1);
		scanf("%d",&p[i]);
	}
	for(int i = 0;i < num;i++)
		sum += p[i];
	return (double)sum/num;
}

int main(){
	int *p = NULL,num;
	double average; 
	printf("输入数字个数:");
	scanf("%d",&num);
	
	p = (int *)malloc(num*sizeof(int));							//向系统申请空间
	
	if(p == NULL){
		printf("空间不足\n");
		exit(0);
	}
	
	printf("average:%f\n",aver(p,num));
	free(p);													//释放空间
	return 0;
}
发布了41 篇原创文章 · 获赞 28 · 访问量 9076

猜你喜欢

转载自blog.csdn.net/wang15877/article/details/100807184