动态数组的概念性理解以及一维和二维数组的创建和使用

首先定义头文件

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>

1.分配内存函数空间函数malloc()

调用形式:

(类型说明符*)malloc(unsigned int size)

功能:

在内存的动态存储区中分配一块长度为‘size’字节的连续区域

int *p = (int *)malloc(10*sizeof(int));   //important    不用初始化 

因为malloc为void类型,所以进行强制类型(类型说明符)转化为int类型,分配10个size字节的长度 

if(p==NULL)
	{
		printf("%s",strerror(errno));
	}

如若开辟失败,返回空指针,则可以借助strerror函数来提示相关错误(相较于return 0,这样可以更清晰的看出代码的问题);与此同时需定义头文件的第三个,否则不可使用该函数。如若开辟成功,则可以进行数据的存储。

	else
	{
		int i = 0;
		for(i=0;i<10;i++)
		{
			*(p+i) = i;
		}
		for(i=0;i<10;i++)
		printf("%d",*(p+i));
	}

存入相对应的元素在开辟的空间里,在最后必须对刚才申请的空间进行释放,如若不释放,会造成严重的内存泄漏 ,与此同时,为了防止借助free从而去破坏创建的数组,,一般会将把p指向空指针

free(p);
p = NULL;

完整的代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
int main()
{
	
	int *p = (int *)malloc(10*sizeof(int));   //important    不用初始化 
	if(p==NULL)
	{
		printf("%s",strerror(errno));
	}
	else
	{
		int i = 0;
		for(i=0;i<10;i++)
		{
			*(p+i) = i;
		}
		for(i=0;i<10;i++)
		printf("%d",*(p+i));
	}
	free(p);
	p = NULL;    
}

2.分配内存空间函数calloc()

调用形式:

(类型说明符*)calloc(n,size)

功能:
在内存动态存储区中分配n块长度为‘size’字节的连续区域()

	int *p = (int*)calloc(10,sizeof(int));  //初始化各字节为0,效率较低,但初始化

函数 calloc会在地址之前把申请的空间的每个字节初始化全部为0(而malloc不会进行初始化,会直接开始存储数据)

其他的与malloc函数一模一样

代码段如下:

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
int main()
{
	int *p = (int*)calloc(10,sizeof(int));   
	if(p==NULL)
	{
		printf("%s",strerror(errno));
	}
	else
	{
		int i =0;
		for(i=0;i<10;i++)
	    *(p+i) = i ;
		for(i=0;i<10;i++)
		printf("%d",*(p+i));
		free(p);
		p = NULL;
	}
}

3.realloc

此函数的作用为:动态的调整开辟的内存 。

调用格式为:

int *ptr = realloc(p,40);

 举个简单的例子:

就是在使用malloc开辟的20个字节空间,但是20个字节空间不能满足我们的使用了,希望有40个字节的空间,这里我们就可一使用realloc来动态的调整内存开辟的空间

relloc使用的注意事项:

1.如果p指向的空间之后有足够的空间可以追加,则直接追加,后返回p

2.如果p指向的空间之后没有足够的内存可以追加,则realloc函数会重新找一个新的内存区域,开辟一块满足需求的空间,并且把原来的内存中的数据拷贝回来,释放旧的空间,最后返回开辟的内存空间地址

代码段如下:

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
int main()
{
     int *p = (int *)malloc(5*sizeof(int));     
	if(p==NULL)
	{
		printf("%s",strerror(errno));
	}
	else
	{
		int i = 0;
		for(i=0;i<5;i++)
		{
			*(p+i) = i;
		}
		int *ptr = realloc(p,40);   
		if(ptr!=NULL)                   //对新的指针进行判断是否为空指针(判断是否开辟成功)
		{
			p = ptr;
		}
		for(i=5;i<10;i++)
		{
			*(p+i) = i;
		}
		for(i=0;i<10;i++)
		{
		printf("%d ",*(p+i));
	    }
	    free(p);
	    p=NULL; 
	}
}

4.释放空间函数free()

调用形式:

  free(void *ptr);

功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针的变量,它指向被释放区域的首地址。

一维动态数组的创建和使用:

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<errno.h>
void main()
{
	int *p = NULL,num,i;
	printf("please input the number of element: ");
	scanf("%d",&num);
	p = (int *)malloc(sizeof(int)*num);
	if(p == NULL)
	{
		printf("%s",strerror(errno));   //打印错误 
	}
	else
	{
		printf("please input %d elements:",num);
		for(i=0;i<num;i++)
		scanf("%d",&p[i]);
		printf("%d elements are : \n",num);
		for(i=0;i<num;i++)
		  printf("%d ",p[i]);
		  free(p);     //释放有malloc()函数申请的内存块 
		  p = NULL; 
	}
	
}

二维数组的创建和使用:

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<errno.h>
void main()
{
	int n1,n2;
	int **p,i,j;
	printf("请输入一维长度:");
	scanf("%d",&n1);
	puts("请输入二维长度:");
	scanf("%d",&n2);     //遵循从里向外的原则
	p = (int**)malloc(n1*sizeof(int *));
	if(p == NULL)
	{
		printf("%s",strerror(errno));   //打印错误 
	} 
	else
	{
		for(i=0;i<n1;i++)
		{
			p[i] = (int*)malloc(n2*sizeof(int));
			if(p[i] == NULL)
			{
				printf("%s",strerror(errno));   //打印错误 
			}
			for(j=0;j<n2;j++)
			{
				p[i][j] = i+j+1;
				printf("%d\t",p[i][j]);
			}
			puts("");
		}
		for(i=0;i<n1;i++)
		free(p[i]);      //释放二维指针 
		free(p);         //释放一维指针 
	}
}

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜路难行々

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值