【发布时间】:2021-08-12 18:56:33
【问题描述】:
这是真的吗:
- 没有数据指针大于
sizeof(void *)? - 没有数据指针大于
sizeof(char *)? - 没有大于
sizeof(intmax_t)的整数? -
float和double都不大于sizeof(long double)?
我知道intmax_t 可以存储任何其他有符号整数可以存储的任何值,但是是否要求大小也是任何整数的最大大小?或者是否有可能某个其他整数使用了比intmax_t 更多的填充位,以至于该整数的大小变得大于intmax_t,即使这个整数不能保存intmax_t 不能保存的任何值?
与指针类似,我知道任何其他数据指针都可以通过转换为 char * 和 void * 并再次返回而不会丢失信息,但这是否意味着 char * 和 void * 的大小必须是所有数据指针的最大可能大小?
我问这个问题是因为我在库中有一个函数,可以将字符串转换为由整数表示的不同类型。为了测试是否可以为给定的字符串完成此对话(格式正确),存在一个针对不同数据类型测试此对话的函数,该函数应为所有可能的类型保留足够的内存,进行对话,检查错误并释放又是这段记忆。是否足以确保intmax_t 足以覆盖所有整数类型?
【问题讨论】:
-
C 标准不需要这些。例如,一个实现可以包含带有
int *的元数据,而它不带有void *,使得int *大于void *,即使它不能处理尽可能多的不同位置。或者它可以说把你搞砸,然后用一百个未使用的字节填充float。或者,void *可能只有 8 个字节来访问任何 64 位地址,但所有函数指针都是 16 个字节,因为它们包含一些安全信息。 -
@EricPostpischil 对于函数指针:C 中没有要求
void *可以保存函数指针,事实上在一些哈佛架构的微控制器上,函数指针大于void *。其余的:这属于答案。 -
简短的非技术版本是指针即指针即指针(任何给定实现只有一种大小)。
stdint.h类型intmax_t可以保存任何有符号整数值,并且不考虑奇数 12 位浮点数或大于double的精度等。那么通常可以安全地假定float或double大于long double。但如前所述,该标准并没有具体回答您的问题,因此它将是特定于实现的(尽管我知道没有一个违反您的陈述) -
C 标准不要求“指针即指针即指针(任何给定实现只有一个大小)”是有原因的。原因是这对于几个(以前的)重要架构来说根本不正确。 c-faq.com/null/machexamp.html
-
"没有整数大于 sizeof(intmax_t)" -
sizeof(intmax_t)通常是 4 或 8。