在最近的一次代码审查中,有人声称
在选择系统上,
calloc()可以分配超过SIZE_MAX总字节数,但是malloc()有限.
我的主张是错误的,因为calloc()为一个对象数组创建了空间 - 作为一个数组,它本身就是一个对象.没有任何物体的尺寸可以大于SIZE_MAX.
那么我们哪个是正确的?在地址空间大于范围的(可能是假设的)系统上size_t,calloc()当使用产品大于SIZE_MAX?的参数调用时,是否允许成功?
为了使它更具体:以下程序是否会以非零状态退出?
#include <stdint.h>
#include <stdlib.h>
int main()
{
return calloc(SIZE_MAX, 2) != NULL;
}
Run Code Online (Sandbox Code Playgroud) 这是未定义的行为吗?标准的相关部分并没有多说。
size_t n = SIZE_MAX / sizeof(double) + 1;
size_t m = sizeof(double[n]);
Run Code Online (Sandbox Code Playgroud) 我正在使用 C++11 及更高版本,我在问自己是否可以安全地获取数据类型所需的字节数,例如std::uint16_t发送长度不可知的协议。更精确的调用是否安全,sizeof(std::uint16_t)我可以假设这总是 2 吗?怎么样std::int16_t?