动态数组函数 malloc

程序员成长之旅 · 程序员成长之旅/C语言/笔记 · 451 字

以前 我们创建的数组通常都是"静态数组" 即 给定一个固定大小

有的时候 我们无法在编写程序的时候预知用户输入多少数据  定义多了就浪费,定义少了又不够

这个时候我们就需要动态数组帮助我们解决问题

要注意的是 这个函数如果用不好 很危险

因为静态数组会随着使用被系统自动释放内存

而动态数组 是全局的  若不手动释放就会随着时间造成程序缓慢 最终造成宕机  (这种情况称之为 "内存泄漏")

随意我们还需要配合函数 free 来释放不需要的内存

#include<stdlib.h>
//语法
//arr为指针类型  int* arr;
arr=malloc(sizeof(变量类型)*所需的空间大小);//因为malloc是以最小的单位字节为单位 所以需要手动计算
//一般来说 若内存申请失败 就需要进行异常操作  所以malloc一般配合if使用
if((arr=malloc(sizeof(变量类型)*所需的空间大小))==NULL)
    return -1;
//free函数
free(arr);
arr=NULL;//防止出现野指针
#include<stdio.h> 
#include<stdlib.h>
int size=0;
int lenght=0;
int* data;
int* strArr(void)
{
	if((data=(int*)malloc(sizeof(int)*10))==NULL){
		return -1;
	}
	lenght=10;
	return data;
}
int resize(int newCapacity)
{
	int* newArr;
	if((newArr=(int*)malloc(sizeof(int)*newCapacity))==NULL){
		return -1;
	}
	for(int i=0;i<lenght;i++){
		newArr[i]=data[i];
	}
	free(data);
	data=newArr;
	newArr=NULL;
	lenght=newCapacity;
}
void addArr(int index,int newData)
{
	if(index<0||index>size){
		return 233;
	}
	if(size==lenght){
		resize(lenght*2);
	}
	for(int i=size-1;i>=index;i++){
		data[i+1]=data[i];
	}
	data[index]=newData;
	size++;
}
void printAll(void)
{
	printf("The size is [%d],lenght is[%d]\n",size,lenght);
	for(int i=0;i<size;i++){
		printf("[%d]\t",data[i]);
		if(i%10==0){
			printf("\n");
		}
	}
}
int main() 
{
	strArr();
	
	for(int i=0;i<300;i++) {
		addArr(i,i);
	}
	printAll();
}