如果malloc一个大于size_t的值怎么办

时间:2022-05-27 17:01:56

如果malloc一个大于size_t的值怎么办,我该如何写呢

????

23 个解决方案

#1



size_t* len = (size_t*)malloc(sizeof(size_t));

#2



// malloc一个大于size_t的值 ===> malloc一个大于size_t的空间

#3


分多次malloc。

引用 楼主 booirror 的回复:
如果malloc一个大于size_t的值怎么办,我该如何写呢

????

#4


很难分配额到那么大连续空间! sizeof(size_t)一般等于字长。

#5


那得多少G内存噢.

#6


用文件读写模拟内存读写,参考_lseeki64函数。

#7


引用 3 楼 turingo 的回复:
分多次malloc。

引用 楼主 booirror 的回复:如果malloc一个大于size_t的值怎么办,我该如何写呢

????
++

#8


引用 楼主 booirror 的回复:
如果malloc一个大于size_t的值怎么办,我该如何写呢

????

没有办法的
void * malloc(size_t size);
size 受 size_t 表示范围的限制。

也就是说即使你的机器有64G的内存,如果你运行32位程序的话, 地址空间就只有4G,

#9


不可能动作。。。

#10


引用 6 楼 zhao4zhong1 的回复:
用文件读写模拟内存读写,参考_lseeki64函数。

正解!

#11


机器/编译器也不让你分配这么大的。

#12


引用 6 楼 zhao4zhong1 的回复:
用文件读写模拟内存读写,参考_lseeki64函数。

如果非要这样操作,赵老师的方法好用。

#13


盖次说 512K 的内存已足够

#14


引用 8 楼 mymtom 的回复:
引用 楼主 booirror 的回复:如果malloc一个大于size_t的值怎么办,我该如何写呢

????
没有办法的
void * malloc(size_t size);
size 受 size_t 表示范围的限制。

也就是说即使你的机器有64G的内存,如果你运行32位程序的话, 地址空间就只有4G,


+1 不可能的。。除非像赵老师的那样,随时写入硬盘。。。

#15


size_t是理论上你能分配的最大内存,所以你不可能malloc一个大于size_t的值。

#16


引用 12 楼 zjq9931 的回复:
引用 6 楼 zhao4zhong1 的回复:用文件读写模拟内存读写,参考_lseeki64函数。
如果非要这样操作,赵老师的方法好用。

“货卖识家”啊!总算遇到识货的了!!

#17


32位机上size_t是4个字节,也就是32位,最大值能到4G。肯定够用啊

#18



当需要很大内存时,就要考虑是不是真要必须一下子导入那么多数据。此时如有可能就要换一种算法!可以考虑老赵的方法!

#19


引用 6 楼 zhao4zhong1 的回复:
用文件读写模拟内存读写,参考_lseeki64函数。

如确有必要,重新封装malloc,用文件内存影射方法在内部重新实现接口模拟内存读写

#20


引用 17 楼 asyougo 的回复:
32位机上size_t是4个字节,也就是32位,最大值能到4G。肯定够用啊


为什么够用呢?32位机的地址空间只有4G大小,,分配大于4G的内存能够么?~

#21


引用 20 楼 Athenacle_ 的回复:
引用 17 楼 asyougo 的回复:32位机上size_t是4个字节,也就是32位,最大值能到4G。肯定够用啊

为什么够用呢?32位机的地址空间只有4G大小,,分配大于4G的内存能够么?~

32位机不可能访问大于4G的内存空间,因为它的地址总线只有32条。2^32=4G。如果要访问大于4G的内存空间,要用64位机。

#22


引用 21 楼 asyougo 的回复:
引用 20 楼 Athenacle_ 的回复:引用 17 楼 asyougo 的回复:32位机上size_t是4个字节,也就是32位,最大值能到4G。肯定够用啊

为什么够用呢?32位机的地址空间只有4G大小,,分配大于4G的内存能够么?~
32位机不可能访问大于4G的内存空间,因为它的地址总线只有32条。2^32=4G。如果要访问大于4G的内存空间,要用64位机。……


那不就OK了?64位机的size_t有64位,但问题是现在的CPU基本上的可寻址空间还没达到2^64的级别啊,OS就更不用说了,,所以,LZ的问题的回答就是 不可能了的啊

#23


提醒:如果需要大于整个硬盘空间的存储空间,用_lseeki64也不行。
但可以参考Google的大文件系统。

#1



size_t* len = (size_t*)malloc(sizeof(size_t));

#2



// malloc一个大于size_t的值 ===> malloc一个大于size_t的空间

#3


分多次malloc。

引用 楼主 booirror 的回复:
如果malloc一个大于size_t的值怎么办,我该如何写呢

????

#4


很难分配额到那么大连续空间! sizeof(size_t)一般等于字长。

#5


那得多少G内存噢.

#6


用文件读写模拟内存读写,参考_lseeki64函数。

#7


引用 3 楼 turingo 的回复:
分多次malloc。

引用 楼主 booirror 的回复:如果malloc一个大于size_t的值怎么办,我该如何写呢

????
++

#8


引用 楼主 booirror 的回复:
如果malloc一个大于size_t的值怎么办,我该如何写呢

????

没有办法的
void * malloc(size_t size);
size 受 size_t 表示范围的限制。

也就是说即使你的机器有64G的内存,如果你运行32位程序的话, 地址空间就只有4G,

#9


不可能动作。。。

#10


引用 6 楼 zhao4zhong1 的回复:
用文件读写模拟内存读写,参考_lseeki64函数。

正解!

#11


机器/编译器也不让你分配这么大的。

#12


引用 6 楼 zhao4zhong1 的回复:
用文件读写模拟内存读写,参考_lseeki64函数。

如果非要这样操作,赵老师的方法好用。

#13


盖次说 512K 的内存已足够

#14


引用 8 楼 mymtom 的回复:
引用 楼主 booirror 的回复:如果malloc一个大于size_t的值怎么办,我该如何写呢

????
没有办法的
void * malloc(size_t size);
size 受 size_t 表示范围的限制。

也就是说即使你的机器有64G的内存,如果你运行32位程序的话, 地址空间就只有4G,


+1 不可能的。。除非像赵老师的那样,随时写入硬盘。。。

#15


size_t是理论上你能分配的最大内存,所以你不可能malloc一个大于size_t的值。

#16


引用 12 楼 zjq9931 的回复:
引用 6 楼 zhao4zhong1 的回复:用文件读写模拟内存读写,参考_lseeki64函数。
如果非要这样操作,赵老师的方法好用。

“货卖识家”啊!总算遇到识货的了!!

#17


32位机上size_t是4个字节,也就是32位,最大值能到4G。肯定够用啊

#18



当需要很大内存时,就要考虑是不是真要必须一下子导入那么多数据。此时如有可能就要换一种算法!可以考虑老赵的方法!

#19


引用 6 楼 zhao4zhong1 的回复:
用文件读写模拟内存读写,参考_lseeki64函数。

如确有必要,重新封装malloc,用文件内存影射方法在内部重新实现接口模拟内存读写

#20


引用 17 楼 asyougo 的回复:
32位机上size_t是4个字节,也就是32位,最大值能到4G。肯定够用啊


为什么够用呢?32位机的地址空间只有4G大小,,分配大于4G的内存能够么?~

#21


引用 20 楼 Athenacle_ 的回复:
引用 17 楼 asyougo 的回复:32位机上size_t是4个字节,也就是32位,最大值能到4G。肯定够用啊

为什么够用呢?32位机的地址空间只有4G大小,,分配大于4G的内存能够么?~

32位机不可能访问大于4G的内存空间,因为它的地址总线只有32条。2^32=4G。如果要访问大于4G的内存空间,要用64位机。

#22


引用 21 楼 asyougo 的回复:
引用 20 楼 Athenacle_ 的回复:引用 17 楼 asyougo 的回复:32位机上size_t是4个字节,也就是32位,最大值能到4G。肯定够用啊

为什么够用呢?32位机的地址空间只有4G大小,,分配大于4G的内存能够么?~
32位机不可能访问大于4G的内存空间,因为它的地址总线只有32条。2^32=4G。如果要访问大于4G的内存空间,要用64位机。……


那不就OK了?64位机的size_t有64位,但问题是现在的CPU基本上的可寻址空间还没达到2^64的级别啊,OS就更不用说了,,所以,LZ的问题的回答就是 不可能了的啊

#23


提醒:如果需要大于整个硬盘空间的存储空间,用_lseeki64也不行。
但可以参考Google的大文件系统。