【发布时间】:2017-01-26 09:24:32
【问题描述】:
我没有在 C11 标准中找到任何说明字符串不能长于SIZE_MAX(其中SIZE_MAX 表示size_t 类型的最大值)字符的内容。例如。如果size_max 是long,并且在我的实现中有一个严格大于long 的long long 类型,那么我可以使用long long 定义和索引这样的字符串。
但是,这会暗示一些不寻常的情况:例如,strlen 可能无法返回字符串的实际大小,因为结果会在末尾转换为 size_t,因此字符串的长度例如,SIZE_MAX+1 将被报告为大小为 0。例如,这会违反标准,从而阻止此类字符串的存在吗?作为参考,7.24.6.3 只说:
7.24.6.3 strlen 函数
概要
#include <string.h>
size_t strlen(const char *s);说明
strlen 函数计算 s 所指向的字符串的长度。
退货
strlen 函数返回终止空字符之前的字符数。
我是否遗漏了什么,或者这在(给定的符合标准的)C11 实现中完全有效?
【问题讨论】:
-
"那么我可以使用 long long 分配 [ ...] 一个字符串。" 假设动态分配,你不能,因为
malloc()需要一个size_t。 -
C11 草案“建议”在 7.19/4 下:“用于
size_t和ptrdiff_t的类型的整数转换等级不应大于signed long int,除非实现支持足够大的对象以使其成为必要。" 这间接表明不会有大于SIZE_MAX的对象。 -
@alk 很好,我的意思是“声明”而不是“分配”。我修正了那个短语。
-
IMO 旨在创建大于
SIZE_MAX的对象。在这种情况下,标准的几个部分是有问题的。 C++ 标准明确说明了这一点,但 C 标准没有。
标签: c string language-lawyer c11