技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 算法 --> 小心 int 乘法溢出!

小心 int 乘法溢出!

浏览:1369次  出处信息

   C/C++ 语言里, 绝大部分平台上 int 类型是 32 位的, 无论你的操作系统是否是 64 位的. 而一些常用的函数, 如 malloc(), 它接受的参数是 size_t 类型:

void *  malloc ( size_t size );

   如果你写出这样的代码:

int mb = 3000; // 3000MB ~= 3GB
void *p = malloc(mb * 1024 * 1024); // WRONG!

   这是非常危险的, 因为那个乘法得到的结果也是 int 类型, 但已经溢出了, 所以

mb * 1024 * 1024 = -1073741824;

   然后

malloc(-1073741824) = malloc((size_t)-1073741824);

   在 64 位系统里, size_t 是 64 位正整数, 所以

(size_t)-1073741824 = 18446744072635809792

   相当于你试图分配那么多内存! 远远超出你的相像. 我在 SSDB 项目里就踩到过几次这种坑! 所以, 记住

   小心乘法运算!

建议继续学习:

  1. 最常见的电话号码    (阅读:2962)
  2. java中byte转换int时为何与0xff进行与运算    (阅读:3056)
  3. 整型(int)数字溢出在程序和数据库设计中的考虑    (阅读:2810)
  4. java中byte转换int时为何与0xff进行与运算    (阅读:2249)
  5. C语言的整型溢出问题    (阅读:1887)
  6. 大整数乘法    (阅读:1455)
  7. Android libcutils库中整数溢出导致的堆破坏漏洞的发现与利用    (阅读:894)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1