解决这个问题,先要知道以下知识:
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上运行后,好像结果返回一个指针;
既然知道了,返回的是一个指针,那么具体返回的什么意思;按理说是一个内存为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!");
}
}
首先,需要知道,malloc是从堆中使用链表进行申请的。所以申请的空间不单单是数据部分,还有一部分链表的头指针这些空间;
其次,malloc(0)申请到的空间,**根据编译器不同,可能分给你的比你要申请的多。**也就是说,虽然你申请0空间的内存,但是还是可以进行操作的。
所以,在上面的程序中,对p进行赋值,是可以打印的;
但是,多分配的空间又是多少?
这个,可以自己测试,当使用的超过分配的大小以后,在进行free操作的时候,程序会崩溃;
可以参考:
https://www.cnblogs.com/xiaowenhu/p/3222709.html
最后,再问一个问题,如果==malloc(-2)==这个是什么现象?
可以自行思考,也可以评论,然后一起讨论。