c - 必须 sizeof(void*) >= sizeof(size_t) 吗?
问题描述
这里有一个关于 和 的平等的问题sizeof(size_t)
,sizeof(void*)
公认的答案是不能保证它们是平等的。
但至少,必须是这样的:
sizeof(void*) >= sizeof(size_t)
我认同。因为,在给定的 C 实现中取最大的存储对象,大小为S
。现在,存储区域可以被认为是 size 的字节数组S
。因此,必须有一个指向每个字节的指针,并且所有这些指针都是可比的和不同的。因此,type 的不同元素个数void*
必须至少是 type 的最大个数size_t
,即无符号整数类型。因此sizeof(void*) >= sizeof(size_t)
。
我的推理是否合理?
解决方案
我的推理是否合理?
您重新推理的问题是您假设最大对象的大小可能等于 SIZE_MAX。但事实并非如此。如果你这样做
void* p = malloc(SIZE_MAX);
您将(很可能)返回一个 NULL 指针。
您可能还会收到以下警告:
main.cpp:48:15: warning: argument 1 value '18446744073709551615' exceeds maximum object size 9223372036854775807 [-Walloc-size-larger-than=]
48 | void* p = malloc(SIZE_MAX);
| ^~~~~~~~~~~~~~~~
由于最大对象大小不是(总是)SIZE_MAX,因此您不能使用 SIZE_MAX 的值来争论指针的大小。
顺便说一句:某些在软件级别使用 64 位指针的 CPU 实现在硬件级别可能没有 64 位。相反,某些位仅被视为全一/全零。
推荐阅读
- html - CSS更改图像href和src
- java - 如何按键获取groupingBy结果的最大值
- java - 如何在 spigot 插件中生成生物群落
- java - Java 泛型,如何在没有 instanceof 或强制转换的情况下做到这一点?
- sql-server - 我能否在不影响现有 Express 版实例的情况下卸载 SQL Server Standard 版实例?
- javascript - 使用 javascript 限制客户端访问 html 页面
- typescript - 如何在没有分区键的 DynamoDb 表中查找值?
- ros - Github Action 和 ROS
- .net-core - 使用 Entity Framework Core 5 的自引用表
- c++ - 当用户输入错误的字符时,我的 do while 循环将永远重复