您当前的位置: 首页 > 
  • 3浏览

    0关注

    322博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

教你学会常见的动态内存错误和经典题目

森明帮大于黑虎帮 发布时间:2021-03-14 17:11:00 ,浏览量:3

系列文章目录

文章目录
  • 系列文章目录
  • 前言
  • 一、动态内存开辟的定义
  • 二、动态内存开辟错误
        • 1.对NULL指针的解引用操作
        • 2.对开辟空间的越界访问
        • 3.对非动态开辟的空间使用free释放
        • 4.使用free释放一块动态内存开辟的空间
        • 5.对同一块内存多次释放
        • 6.对开辟的内存空间忘记释放,内存泄漏问题
  • 二、动态内存开辟错误经典笔试题
        • 1.空指针传参,类似于值传递
        • 2.局部变量和形式参数存在于栈上
        • 3.内存泄露问题
        • 4.非法访问内存问题
  • 总结

一、动态内存开辟的定义

所谓动态内存分配(Dynamic Memory Allocation)是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。   我们在定义数组时,需要知道数组的大小,当我们不确定数组大小时需要定义足够大的数组来存放数据,这样造成了空间的浪费,一旦空间不够用时又要重新修改程序,这样的方式是静态内存分配,使用动态内存分配可以很好的解决这一问题。

二、动态内存开辟错误 1.对NULL指针的解引用操作

代码如下(示例):

动态内存错误
1.对NULL指针进行解引用操作
void test()
{
 int *p = (int *)malloc(INT_MAX/4);
 *p = 20;//如果p的值是NULL,就会有问题
 free(p);
}

正确代码:
int main()
{
	int* pa = (int*)malloc(INT_MAX);
	if (pa == NULL)//判断pa是否为空
	{
		printf("开辟失败!\n");
	}
	else
	{
		*pa = 0;
		free(pa);
		pa = NULL;
	}
	return 0;
}
2.对开辟空间的越界访问

代码如下(示例):

int main()
{
	int* pa =(int*) malloc(10 * sizeof(int));
	if (pa == NULL)
	{
		printf("开辟失败!\n");
	}
	else
	{
		int i = 0;
		for (i = 0; i             
关注
打赏
1664288938
查看更多评论
0.0742s