Part A:
1.
What does the code fragment output and why?
char *ptr;
if((ptr=(char *)malloc(0))==NULL)
puts("Got a null pointer");
else
puts("Got a valid pointer");
解题第一步:读懂代码,首先要知道malloc()的作用:
而malloc(0)有意味着什么呢?是否就等同于NULL呢?
答案是否定的:
malloc(0)即是:分配的空间为0
,但是分配的空间为0不等于NULL,
我们可以这么理解:当执行代码malloc()时,系统在堆区【1】中分配相应一小块内存,其中包含两部分:记录头部和可用内存。由于是0,所以可用内存为0,但是记录头部仍然存在。
而NULL没有任何实体,也就不存在记录头部和可用内存了。
所以NULL不同于malloc(0)
即定义的字符型指针虽申请内存为0,但是不为空。
所以输出结果为:Got a valid pointer
最后呈上代码和运行截图
代码:
#include
using namespace std;
int main()
{
char
*ptr;
if((ptr=(char *)malloc(0))==NULL)
//cout<
puts("Got a null pointer");
else
//cout<
puts("Got a valid pointer");
system("pause");
return
0; }
运行截图:
附录:
【1】程序运行时的内存占用
一个程序将操作系统分配其运行的内存块分成4个区域:
代码区: 存放程序的代码部分;
数据区: 存放程序的全局数据和静态数据;
堆区: 存放程序动态申请的数据;
栈区: 存放程序的局部数据和参数(不能用于返回值return语句);
为什么用malloc函数是在堆区上分配?
那是因为使用malloc或new函数是需要动态申请内存空间的,所以是在堆区上分配的,而且程序员要自己负责在不用试用free或delete释放内存,动态内存的生存期由我们决定,使用非常灵活,但问题也最多!