考考你,下面的函数为什么要这么写!!

coolan 2014-09-05 04:12:09

本来是自己想问的,可是问题发出来后,自己就想到了原因,所以就弄个智力题算了。大家可以娱乐一下。O(∩_∩)O
MagickExport void *AcquireQuantumMemory(const size_t count,const size_t quantum)
{
size_t
size;

size=count*quantum;
if ((count == 0) || (quantum != (size/count)))
{
errno=ENOMEM;
return((void *) NULL);
}
return(AcquireMagickMemory(size));
}

其中判断count的值为什么不在 size=count*quantum;之前进行。为什么判断中还会有(quantum != (size/count));
...全文
189 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
coolan 2014-09-07
  • 打赏
  • 举报
回复
O(∩_∩)Ol楼上都是高手
mujiok2003 2014-09-05
  • 打赏
  • 举报
回复
1. 短路求值, 避免除零 2. 检测size = count * num是否溢出
707wk 2014-09-05
  • 打赏
  • 举报
回复
引用 8 楼 lovesmiles 的回复:
检查需求内存是否在0和size_t可以表示的最大值之间
+1+1,接分
勤奋的小游侠 2014-09-05
  • 打赏
  • 举报
回复
检查需求内存是否在0和size_t可以表示的最大值之间
jwj070524 2014-09-05
  • 打赏
  • 举报
回复
分配内存前检查参数的函数,函数一共分配count*quantum字节,先乘后除的目的是防止分配内存过大,最大不能超过size_t所能表示的范围;同时分配0字节是返回NULL,errno设置为ENOMEM(感觉有点不合理)。
zhousitiaoda 2014-09-05
  • 打赏
  • 举报
回复
而且形参用const在这里貌似也没什么用
nice_cxf 2014-09-05
  • 打赏
  • 举报
回复
判断是否为0,在前边也没问题吧? 这个不就是判断是否溢出么?
Kai_gai 2014-09-05
  • 打赏
  • 举报
回复
count是除数
老王爱上猫 2014-09-05
  • 打赏
  • 举报
回复
不明觉厉..
starytx 2014-09-05
  • 打赏
  • 举报
回复
size 需要先有值吧。当size的值超过了size_t能表示的最大值后会被截断处理(size会变),所以除的结果就和quantum不相等了。
dbzhang800 2014-09-05
  • 打赏
  • 举报
回复
没看懂你要做什么,也没看懂你的两个“为什么”会对你的代码有什么影响

64,642

社区成员

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

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