首先定义头文件
#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); //释放一维指针
}
}