malloc(0)返回什么地址?

问题内容:malloc(0)返回什么地址?
原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=4351400
所属论坛:C语言 审核组:C/C++
提问者:jidahyx 解决者:steedhorse
感谢:steedhorse
关键字:
答案:

char p = (char )malloc(0);
strcpy(p, “hello”);
printf(“%s/n”,p);
free(p);

其中,p中的地址是堆内的首地址?

C99标准(ISO/IEC 9899:1999 (E))上说:

If the size of the space requested is zero, the behavior is implementationdefined:
either a null pointer is returned, or the behavior is as if the size were some
nonzero value, except that the returned pointer shall not be used to access an object.

如果所请求的空间大小为0,其行为由库的实现者定义:可以返回空指针,也可以让效果跟申请某个非0大小的空间一样,所不同的是返回的指针不可以被用来访问一个对象。

为什么 new T[0] 和 malloc(0) 不返回空指针

首先需要说明的是,按照C++标准,成功的 new T[0] 是不能返回空指针的。而 malloc(0),C 语言标准则指出,成功的时候可以返回空指针,也可以返回非空指针,多数库一般也选择了返回非空指针这种行为。

为什么这么做呢?
1. 理念:0大小的对象也是对象。
2. 实践:返回空会和分配失败混淆,尤其是大小是计算出来的时候,这时如果得到的是空指针,用户程序会误以为分配失败了。
3. 实现:反正返回的地址不能读写,此时可以返回同一个固定的地址,并没什么额外开销。而且多数编译器,C和C++一起提供,C++库的new也用C库的malloc实现,使二者保持一致也比较省事。
4.不管返回的是不是空,都可以free的。

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
char *ptr;
printf("%p\n", ptr); // this line will cause seg fault sometimes

printf("----malloc 0 4 times----\n");
ptr = (char *)malloc(0);
printf("%p\n", ptr);

ptr = (char *)malloc(0);
printf("%p\n", ptr);

ptr = (char *)malloc(0);
printf("%p\n", ptr);

ptr = (char *)malloc(0);
printf("%p\n", ptr);

printf("----malloc 1 4 times----\n");
ptr = (char *)malloc(1);
printf("%p\n", ptr);

ptr = (char *)malloc(1);
printf("%p\n", ptr);

ptr = (char *)malloc(1);
printf("%p\n", ptr);

ptr = (char *)malloc(1);
printf("%p\n", ptr);

printf("----malloc 4 4 times----\n");
ptr = (char *)malloc(4);
printf("%p\n", ptr);

ptr = (char *)malloc(4);
printf("%p\n", ptr);

ptr = (char *)malloc(4);
printf("%p\n", ptr);

ptr = (char *)malloc(4);
printf("%p\n", ptr);

printf("----malloc 16 4 times----\n");
ptr = (char *)malloc(16);
printf("%p\n", ptr);

ptr = (char *)malloc(16);
printf("%p\n", ptr);

ptr = (char *)malloc(16);
printf("%p\n", ptr);

ptr = (char *)malloc(16);
printf("%p\n", ptr);

printf("----malloc 32 4 times----\n");
ptr = (char *)malloc(32);
printf("%p\n", ptr);

ptr = (char *)malloc(32);
printf("%p\n", ptr);

ptr = (char *)malloc(32);
printf("%p\n", ptr);

ptr = (char *)malloc(32);
printf("%p\n", ptr);

printf("----malloc 64 4 times----\n");
ptr = (char *)malloc(64);
printf("%p\n", ptr);

ptr = (char *)malloc(64);
printf("%p\n", ptr);

ptr = (char *)malloc(64);
printf("%p\n", ptr);

ptr = (char *)malloc(64);
printf("%p\n", ptr);

return 0;
}

64位 ubuntu14.04 测试结果如下:

kjlr@kjlr-E400:~$ ./a.out 
(nil)
----malloc 0 4 times----
0x2140010
0x2140030
0x2140050
0x2140070
----malloc 1 4 times----
0x2140090
0x21400b0
0x21400d0
0x21400f0
----malloc 4 4 times----
0x2140110
0x2140130
0x2140150
0x2140170
----malloc 16 4 times----
0x2140190
0x21401b0
0x21401d0
0x21401f0
----malloc 32 4 times----
0x2140210
0x2140240
0x2140270
0x21402a0
----malloc 64 4 times----
0x21402d0
0x2140320
0x2140370
0x21403c0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值