关于malloc(0)的一些思考

解决这个问题,先要知道以下知识:

解决1

ptr = malloc(0);

首先,要知道这个语句有没有问题,最好的方式就是自己跑一下程序;不过答案是,没有语法错误,甚至没有警告!

以下是我查到的关于返回的解答:

malloc() allocates size bytes and returns a pointer to the allocated memory. The memory is not cleared. If size is 0, then malloc() returns either NULL, or a unique pointer value that can later be successfully passed to free().

意思就是:返回值要么是NULL,要么是一个可以被free调用的唯一的指针。

而经过实践,在window和linux上运行后,好像结果返回一个指针;

解决2

既然知道了,返回的是一个指针,那么具体返回的什么意思;按理说是一个内存为0的空间?

从个人理解上来说,如果申请一个大小为0的空间,相当于你无法给这个空间进行赋值等操作;而返回一个非NULL指针,仅仅是让你在free的时候,不会产生错误;

官方的意思其实就是这样,为了避免对size的大小进行判断,使size=0的情况也返回一个指针,这样在free的时候就可以做到统一性;

所以,如何避免这个问题呢?其实,如果程序员手动申请内存的话,一般不会出现这个问题;而当size为形参进行申请内存后,size可能就是用户进行设置的,也就是说,在这里可能会导致size=0的情况出现。所以,只要在size>0的时候进行malloc,就可以避免这个问题。

实践

所有理论的知识都要进行实践;
所以,我用dev-c++进行测试;编译器版本是TDM-GCC 4.9.2 64-bit release;

int main(int argc, char *argv[]) {
	char *p;
	p = (char *)malloc(0);
	
	if(p==NULL)
		printf("get NULL\n") ;
	else
	{
		printf("get a valib value\n");
		printf("addr:%x\n",p);
		memcpy(p,"abc",2);
		printf("addr:%x is %d,%d\n",p,*p,*(p+1));
		free(p);
		printf("free success!");
	}
}

运行结果如下:
在这里插入图片描述
好了,从上面的结果分析出:

  1. malloc(0)返回的不是NULL;
  2. 居然能对申请地址0的空间进行操作,并且还能打印!
  3. 能free成功!

解析

首先,需要知道,malloc是从堆中使用链表进行申请的。所以申请的空间不单单是数据部分,还有一部分链表的头指针这些空间;

其次,malloc(0)申请到的空间,**根据编译器不同,可能分给你的比你要申请的多。**也就是说,虽然你申请0空间的内存,但是还是可以进行操作的。

所以,在上面的程序中,对p进行赋值,是可以打印的;

但是,多分配的空间又是多少?
这个,可以自己测试,当使用的超过分配的大小以后,在进行free操作的时候,程序会崩溃;

可以参考:
https://www.cnblogs.com/xiaowenhu/p/3222709.html

最后,再问一个问题,如果==malloc(-2)==这个是什么现象?
可以自行思考,也可以评论,然后一起讨论。

你可能感兴趣的:(#,C)