动态内存经典笔试题分析

1.代码1

void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
int main()
{
Test();
return 0;
}

我们先来分析一下这串代码,我们创建了两个函数,在Test中调用了GetMemory函数,了解到我们的目的是想将hello word 拷贝到calloc开辟的空间里面,然后在终端打印出来,我们一看代码好像没什么问题,那我们来运行一下,看看能不能达到我们想要的效果。

运行结果:

没有任何结果,这是为什么呢?因为在GetMemory中申请的空间是局部变量,出函数就会被销毁。所以我们拷贝不过来,运行结果也为空。

2.代码2 

char* GetMemory(void)
{
	char p[] = "hello world";
	return p;
}
void Test(void)
{
	char* str = NULL;
	str = GetMemory();
	printf(str);
}
int main()
{
	Test();
	return 0;
}

那这串代码的运行结果又是什么呢?我们来看看:

为什么是一串乱码呢?在这里问题也是出在GetMemry上,创建的数组p在出函数后就被销毁了,str接收了GetMemory的返回值,但这个指针是没有指向任何空间的,所以在打印时就是一些乱码。在这里我们可以将p数组改为静态的(让其出函数不会被销毁),即可。演示如下:

我们使用static将其变为静态数组,只有在程序结束后才会被销毁。

3.代码3 

void GetMemory(char** p, int num)
{
	*p = (char*)malloc(num);
}
void Test(void)
{
	char* str = NULL;
	GetMemory(&str, 100);
	strcpy(str, "hello");
	printf(str);
}
int main()
{
	Test();
	return 0;
}

这个代码运用了二级指针的知识,那么大家思考一下这个能完成我们的目的吗?

结果为:

这是为什么呢?大家可以先思考思考,下一期会解释。嘿嘿

4. 代码4

void Test(void)
{
	char* str = (char*)malloc(100);
	assert(str);
	strcpy(str, "hello");
	free(str);
	if (str != NULL)
	{
		strcpy(str, "world");
		printf(str);
	}
}
int main()
{
	Test();
	return 0;
}

代码的运行结果为:

有人就会想我们已经将str所指向的空间给释放了,怎么还是可以打印出来。在释放了为str指针分配的内存后,仍然在if语句中访问它。这是未定义的行为。能打印出来不代表是对的,也许只是碰巧我们申请的空间没有被覆盖。

谢谢

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-02-12 18:00:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-12 18:00:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-12 18:00:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-12 18:00:01       20 阅读

热门阅读

  1. C 练习实例67-数组最大值与最小值交换

    2024-02-12 18:00:01       31 阅读
  2. LeetCode跳跃游戏 VI

    2024-02-12 18:00:01       32 阅读
  3. Linux查询指令

    2024-02-12 18:00:01       31 阅读
  4. BFS————广度优先搜索

    2024-02-12 18:00:01       30 阅读
  5. springboot+security

    2024-02-12 18:00:01       26 阅读
  6. 蓝桥杯2022 省A 求和

    2024-02-12 18:00:01       25 阅读