A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 2014571245 中级黑马   /  2014-4-26 13:35  /  1255 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 2014571245 于 2014-4-27 10:45 编辑

我用一行这样的代码分配一个巨大的数组, 用于数字运算:
double *array = malloc(300 * 300 * sizeof( double ));
malloc() 并没 有返回 null, 但是程序运行得有些奇怪,
好像改写了某些内存, 或者 malloc() 并没有分配我申请的那么多内存,为什么会产生这样的错误?


评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

5 个回复

倒序浏览
300 * 300 * sizeof( double )  内存溢出了 不能放在int16里,你可以考虑使用 300 * (300 * sizeof(double))

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
{:3_46:}我很诧异。。。为什么你要申请那么大的内存给一个double型指针变量,你申请这么大一块内存需要存上面数据进行计算?能详细说下,你怎么运算了。。出什么错了吗?一个double型数据值占用8个字节。你这是需要存放一个什么数据?
回复 使用道具 举报
话说malloc()函数参数是个size_t类型的参数吧

应该是个Unsigned int.

楼上的Int16怎么来的?

还有那两个表达式有区别吗

而且这句代码没问题 就是申请一个90000个double类型元素的空间啊





回复 使用道具 举报
extern void *malloc(unsigned int num_bytes);这是malloc函数的原型,括号里放的是int类型的数据类型(unsigned忽略符号就不说),既然是int类型,括号里面的数的最大值为2147483648(java中是这么大,2的31次方-1),所以300 * 300 * sizeof( double )没有内存泄露,所以创建内存成功不会返回Null,它返回一个指向内存字节数为300 * 300 * 8(64位编译器)这么大的内存的指针,懂了吧!!!!
回复 使用道具 举报
只是用double *array拿数据的时候只会按照顺序,拿八个字节,其余就不管了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马