c - 将 ptrdiff_t 的正值分配给 size_t 是否安全
问题描述
我试图实现功能,我在linux 内核strlen
中遇到了这个实现:
size_t strlen(const char *s)
{
const char *sc;
for (sc = s; *sc != '\0'; ++sc)
/* nothing */;
return sc - s;
}
根据 C 标准,该操作的最佳拟合类型sc - s
是 ptrdiff_t。
现在在这个片段中,sc
保证大于或等于0
,这意味着我们没有返回负类型的风险。
对于正值,返回sc - c
为是否安全size_t
?换句话说,在现实世界中,实现是否有可能PTRDIFF_MAX
大于SIZE_MAX
?
这是我的实现strlen
:
size_t strlen(const char *s)
{
size_t size = 0;
while (*s != '\0') {
size++;
s++;
}
return size;
}
解决方案
是的,如果传递有效对象是安全的,因为 2 个指针的减法只能使用指向同一对象的指针来完成。
6.5.6 加法运算符
- 当两个指针相减时,两者都应指向同一个数组对象的元素,或者指向数组对象的最后一个元素;结果是两个数组元素的下标之差。...
由于sizeof
运算符最多可以返回SIZE_MAX
,因此表达式sc - s
永远不会返回大于该值的值。
推荐阅读
- python - 与 Python 的 Flask 的用户交互
- python - Python)我想添加两个不同顺序的列表 len
- webpack - Webpack 和 webpack 开发服务器不提供静态文件
- apache - AWS ALB 重定向到 https
- ember.js - Ember JsonApi 序列化覆盖 normalizeResponse。如何解释参数
- linux - NASM 中的无限循环
- html - 如何在带有弹性框的 div 内分配不同高度的 div?
- generics - 如何暗示返回一个在 Rust 中使用动态调度的值?
- python - 如果出现错误,我可以自动重新执行代码吗?
- sql-server - 使用 SQL 语句进行二级查找