动态内存分配
动态内存分配
头文件
#include <stdio.h
#include <stdlib.h
#include <string.h
#include <errno.h
#include <windows.h
malloc
int main()
{
//像内存申请10个整形的空间
int* p =(int*)malloc(10*sizeof(int));//malloc不初始化为零
if(p==NULL)
{
//打印错误的一个方式
printf("%s\n",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;
return 0;
}
calloc
int main()
{
int* p=(int*)calloc(10,sizeof(int));//calloc初始化为零
if(p==NULL)
{
printf("%s\n",strerror(errno));
}
else
{
int i = 0;
for(i=0;i<10;i++)
{
printf("%d ",*(p+i));
}
}
free(p);
p = NULL;
return 0;
}
realloc
int main()
{
int* p = (int*)malloc(20);
if(p==NULL)
{
printf("%s\n",strerror(errno));
}
else
{
int i = 0;
for(i=0;i<5;i++)
{
*(p+i) = i;
}
}
//就是在使用malloc开辟的20个字节空间
//假设这里,20个字节不能满足我们使用
//希望有40个字节的空间
//这里用realloc开辟
//realloc使用注意事项
//1.原有空间后有足够的空间,原空间数据不发生变化
//2.没有足够空间,在堆空间上另找一个合适大小的连续空间来使用。这样函数返回的是一个新地址。
int* p2 = realloc(p,40);
int i = 0;
for(i=5;i<10;i++)
{
*(p+i) = i;
}
for(i=0;i<10;i++)
{
printf("%d ",*(p2+i));
}
free(p);
p = NULL;
return 0;
}
常见问题
```c
int mian()
{
//1.对空指针进行解引用操作
int p = (int)malloc(40);
//万一malloc失败了,p被赋值为NULL
//*p = 0;//err
int i = 0;
for(i=0;i<10;i++)
{
*(p+i) = i;//err
}
free(p);
p = NULL;
//2.对动态开辟的内存的越界访问
int *p = (int*)malloc(5*sizeof(int));
if(p == NULL)
{
return 0;
}
else
{
int i = 0;
for(i=0;i<10;i++)
{
*(p+i) = i;
}
}
free(p);
p = NULL;
//3.对动态开辟内存的free
int a = 10;
int* p = &a;
*p = 20;
free(p);
p = NULL;
int *p = (int*)malloc(40);
if(p == NULL)
{
return 0;
}
// //使用
int *p2 = realloc(p,80);
if(p2 != NULL)
{
p = p2;
}
int *p = realloc(NULL,40);//malloc(40)
//4.使用free释放动态开辟内存的一部分
int *p = (int*)malloc(40);
if(p == NULL)
{
return 0;
}
int i = 0;
for(i=0;i<10;i++)
{
*p++ = i;
}
//回收空间
free(p);
p = NULL;
//5.对同一块动态内存的多次释放
int *p = (int*)malloc(40);
if(p == NULL)
{
return 0;
}
//使用
//释放
free(p);
p = NULL;//避免二次free
//...
free(p);
//6.动态开辟内存忘记释放(内存泄漏)
while(1)
{
malloc(1);
}
return 0;
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 St0Bjahr!
评论
ValineDisqus