关于动态内存的怪异问题

zhangjgbupt 2007-08-01 10:17:09
char* ptr;
if((ptr=(char*)malloc(0))==NULL)
put("get a null pointer");
else
puts("get a valid pointer");

我的测试结果是: 尽管把0传给,但是ptr仍然是有地址的,不知道怎么解释??
...全文
282 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
milefo 2007-08-03
  • 打赏
  • 举报
回复
在操作系统中,很多内存操作都是按块进行的。当然可以有不同的块大小。

这种malloc(x)之类的内存申请,实际是想得到一块不小于其要求的x bytes的空间。

想想,如果让你自己去设计,你会怎样做呢?
我想也不会那么任意的。
taodm 2007-08-03
  • 打赏
  • 举报
回复
4还是小的呢。你申请n一般要按8字节取整,以确保对齐问题,还要额外保留cookie字段。。。
申请了n你就只能当n用,讨论它实际分配了多少是一个没实用价值的行为。
星羽 2007-08-03
  • 打赏
  • 举报
回复
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大小的空间一样,所不同的是返回的指针不可以被用来访问一个对象。
lockhall 2007-08-03
  • 打赏
  • 举报
回复
不過我在VS2005下,好象還是4個字節啊。。。

就是malloc(0);
逸学堂 2007-08-03
  • 打赏
  • 举报
回复
修正上面的if
if (size == 0) // 在这里进行特殊处理
逸学堂 2007-08-03
  • 打赏
  • 举报
回复
malloc(0)
malloc 0其实是已经写到C标准中去了,对于0要特殊处理.
如同new 0一样.一般都是申请一个字节,用于标注申请到的空间.

常见的
void* operator new(size_t size)
{
if (size == 0; // 在这里进行特殊处理
size = 1;
return operator::new(size);
}
Y神圣 2007-08-03
  • 打赏
  • 举报
回复
个人觉得malloc是将0解释为一个长度,int的长度,达人测试一下?
fish6344 2007-08-02
  • 打赏
  • 举报
回复
这是C语言对内存操作malloc的规定:malloc函数只有在内存申请失败的唯一条件成立时才可以返回NULL!在size为0的情况下至少要返回1个char(1byte),以表示malloc操作是一次成功的内存占有。
lockhall 2007-08-02
  • 打赏
  • 举报
回复
這個要mark下。

對于申請0空間明天仔細研究下。

:)
hearmin 2007-08-02
  • 打赏
  • 举报
回复
你如何测试你申请内存的大小,这点很奇怪,不要告诉我你用sizeof。
只要得到的指针指向的内存区域可写,那么当然可以向该指针指向的地方写入数据,只是写入的地方可能是“他人的领地”。
zhangjgbupt 2007-08-02
  • 打赏
  • 举报
回复
但是测试的结果是: 所申请的内存是大小是0,而不是1,而且可以向里存储数据,很奇怪
gfxiang 2007-08-01
  • 打赏
  • 举报
回复
you can google it with key words "malloc 0".
yydrewdrew 2007-08-01
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/5681/5681586.xml?temp=.5015222

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧