加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C中size_t类型的malloc参数的限制是什么? Docs说它有UINT_MAX的

发布时间:2020-12-16 10:46:13 所属栏目:百科 来源:网络整理
导读:我想分配一个2.9GB的char数组 database = (char*) malloc((2900 * 1000000 * sizeof(char))); 这给出了整数溢出警告,malloc返回NULL.该 malloc参数的类型为size_t,根据文档的类型 unsigned int. 所以max应该是UINT_MAX,至少是2.9GB.但是,如果 我尝试分配超过
我想分配一个2.9GB的char数组

database = (char*) malloc((2900 * 1000000 * sizeof(char)));

这给出了整数溢出警告,malloc返回NULL.该
malloc参数的类型为size_t,根据文档的类型
unsigned int.

所以max应该是UINT_MAX,至少是2.9GB.但是,如果
我尝试分配超过MAX_INT的malloc失败.这是否意味着
我的系统上的size_t是int类型?我该如何检查?我看了看

/usr/include/stdlib.h

./lib/gcc/x86_64-redhat-linux/4.1.1/include/stddef.h


找不到size_t的定义.非常感谢

解决方法

这里有两个问题.

首先,溢出警告:2900和1000000都是int类型,因此乘以它们的结果也是int类型.结果不能用32位有符号整数表示,因此它会溢出.您需要将一个(或两个)参数强制转换为size_t以使用无符号算术.

(或者,您可以将sizeof(char)移动为前两个术语之一,因为它的类型是size_t,但您也可以删除sizeof(char),因为它始终是1.)

其次,malloc可以分配的最大大小取决于您运行的平台和程序的当前状态.如果没有足够的连续地址空间来满足请求,很明显malloc将会失败.

此外,您运行的平台可能有一个上限,它可以动态分配一个对象的大小.您需要查阅平台的文档以了解该上限是什么.

size_t肯定不是int,因为int总是有符号的,而size_t总是无符号的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读