#include<>
#include<> //malloc 和free 都在的头文件里
int main()
{
int arr[10] ={0}; //这是在栈中申请连续的四十个空间 是静态的
int * arr1;
int *ptr ;
ptr =(int*)calloc (10,sizeof(int)); //申请一个动态内存空间为40字节
if(ptr==NULL) //防止申请空间失败传入了空指针
{
perror("ptr");
}
arr1=ptr;
arr1 =(int*)realloc (arr1,10000); //改变原有的内存空间
free(arr1);
arr1=NULL;
ptr=NULL;
return 0;
}
1.3常见的动态内存错误:
1.3.1对NULL指针解引用操作:
#include<>
#include<>
int main()
{
int *ptr;
ptr=(int*)malloc(sizeof(int));
*ptr=1; //这里有可能申请失败 ,但我这没有失败,为了以防万一还是需要进行判断一下,正确的申请在上面
free(ptr);
ptr=NULL;
return 0;
}
1.3.2对动态内存的越界:
#include<>
#include<> //malloc 和free 都在的头文件里
int main()
{
int *ptr ;
ptr =(int*)malloc(40); //申请一个动态内存空间为40字节
if(ptr==NULL) //防止申请空间失败传入了空指针
{
perror("ptr");
}
for(int i=0;i<=11;i++)
{
*(ptr+i)=i; //申请的是四十个字节,这里产生了越界
}
for(int i=0;i<=11;i++)
{
printf("%d ",*(ptr+i));
}
free(ptr);
ptr=NULL;
return 0;
}
1.3.3对非动态空间进行释放:
#include<>
#include<>
int main()
{
int *p;
*p=10;
free(p); //这里的p并不是动态内存空间仍然进行了释放
return 0;
}
1.3.4 动态内存空间的部分释放:
#include<>
#include<>
int main()
{
int *p=(int*)malloc(sizeof(int)*2);
if(p==NULL)
{
perror("p");
}
p++;
free(p); //这里的p的地址并不是起始地址,只是进行了部分的释放
p=NULL;
}
1.3.5对一块动态内存进行多次释放:
#include<>
#include<>
int main()
{
int *p=(int*)malloc(sizeof(int)*2);
if(p==NULL)
{
perror("p");
}
free(p);
// ~~~~~~~~~~
free(p); // 已经释放p了有进行了释放
p=NULL;
}
这个真的有可能发生,当我们代码写的比较长的时候,我们有可能忘了我们是否已经释放这块空间,就有可能进行重复的释放,这是不正确的,而解决他的方法是,当我们释放了一块空间后,一定让他指为空指针。
1.3.6动态内存忘记释放(内存泄漏):
#include<>
#include<>
void test(int *p)
{
p=(int*)malloc(sizeof(int)*2);
if(p==NULL)
{
perror("p");
}
}
int main()
{
int *ptr;
test(ptr); //这里就是没有对内存进行释放
}
总结:
对于动态内存还是比较重要的,因为堆的空间是比栈的空间的是大的,同时我们要知道,动态的是可以进行修改的,我们需要多少内存就可以开辟多少内存,防止了内存的浪费,但是我们在申请动态内存的时候一定要防止一些不必要的错误不然就会得不偿失。
最后小马码文不易,如果觉得有帮助就多多支持哈!!!^ _ ^