问题标签 [ptrdiff-t]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 结构成员之间的指针差异?
C99 标准规定:
当两个指针相减时,都应指向同一个数组对象的元素,或者指向数组对象的最后一个元素
考虑以下代码:
这显然违反了上述规则,因为p
andq
指针指向不同的“数组对象”,并且根据规则,q - p
差异是未定义的。
但在实践中,为什么这样的事情会导致未定义的行为?毕竟,结构成员是按顺序排列的(就像数组元素一样),成员之间有任何潜在的填充。诚然,填充量会因实现而异,这会影响计算的结果,但为什么该结果应该是“未定义的”?
我的问题是,我们可以假设标准只是“无知”这个问题,还是有充分的理由不扩大这条规则?上述规则不能改写为“两者都应指向同一数组对象的元素或同一结构的成员”吗?
我唯一的怀疑是分段内存架构,其中成员可能最终位于不同的段中。是这样吗?
我也怀疑这就是 GCC 定义自己的原因__builtin_offsetof
,以便对offsetof
宏进行“符合标准”的定义。
编辑:
正如已经指出的那样,标准不允许对 void 指针进行算术运算。它是一个 GNU 扩展,仅在通过 GCC 时才会发出警告-std=c99 -pedantic
。我正在用void *
指针替换char *
指针。
c++ - 在用户定义的类型上使用 std::ptrdiff_t
我有一个名为 node 的简单结构,它包含一个值 + 2 个指向下一个/上一个节点的指针。
这里我们有在末尾添加一个新节点的函数。
我们主要创建 100 个链接节点,每个节点都有一个唯一的 int 值。
这是指向第一个/最后一个节点的指针:
尝试应用指针算术时,麻烦就开始了:
不知何故node_sum == 528,如果我进行x32编译,那么node_sum == 781。
为什么 node_sum 不是 100 ?
c - 我应该将 size_t 转换为 ptrdiff_t 吗?
我有一个 malloc 的指针数组,形成一个哈希表。要逐步遍历哈希表,我会使用指针算术,例如:
问题是我应该将size_t
返回的sizeof()
to 转换ptrdiff_t
为条件的增量部分中的正确添加for
吗?还是加起来有关系?
c++ - C++ size_t 和 ptrdiff_t 用于负数组索引
我很难在索引类型之间进行选择size_t
,ptrdiff_t
它应该能够存储负值。
准确地说,在我的代码中,我需要实现一个数组。我将它的长度(在构造函数中)作为 的类型接收size_t
,当我重载时,[] operator
我需要索引是类型ptrdiff_t
(而不是size_t
),因为我想允许负索引,如本例所示:
上述设计产生的问题是可用索引的范围受到 的最大值的限制ptrdiff_t
,并且在某些机器中,该上限小于 的最大值size_t
。
IEstd::numeric_limits<std::ptrdiff_t>::max() < std::numeric_limits<std::size_t>::max()
因此,问题是用户可能会创建一个大小大于最大值的数组ptrdiff_t
(但仍然在 的范围内size_t
,当然),但他将无法访问成功超过的数组元素的最大值ptrdiff_t
,因为它们的索引会溢出到负数。在我的机器上,这将可用索引减半!(因为size_t
和ptrdiff_t
都是 64 位,但一个是unsigned
另一个是signed
)
以下是我想出的解决方案,但遗憾的是它们都不是完美的:
在构造函数中,接受 type 的长度
ptrdiff_t
而不是size_t
,并添加一个检查以验证给定的长度是否为负数。优点:它解决了这个问题,因为现在我将能够访问数组中的所有元素,并且仍然允许负索引。
缺点:它限制了数组的最大可能长度。(例如,就像我之前说的,在我的机器中它减半)
保持原样,但在 中
[] operator
,将索引转换为 typesize_t
,并利用负值会溢出的事实。即到给定的索引,添加我们当前指向的元素和
例如,在我之前的示例中,由于 vec2 指向数组中的第二个元素,因此
[] operator
看起来像优点:我们现在可以访问数组中的所有元素。
缺点:使用变得笨拙和丑陋。例如,如果我们创建一个 size 的向量
/li>std::numeric_limits<std::size_t>::max()
,那么为了访问最后一个元素,我们需要访问 '-1' 元素:
c++ - __PTRDIFF_TYPE__ 的跨平台版本
是否有跨平台的方法来确定是否与预处理ptrdiff_t
相同long
或long long
在预处理期间?
我知道__PTRDIFF_TYPE__
应该用 gcc/g++ 给出类型,但它似乎没有在 Windows 的 VC/VC++ 中定义。有比以下更好的方法吗?
如果在预处理期间不可能,是否有编译时方法?我正在寻找一个非 C++11 的解决方案,但如果你有一个非常好的现代解决方案,请随时分享!
c - 在C中将字符串的一部分复制到另一部分
我在尝试将字符串的一部分复制到另一部分时遇到问题。鉴于这两个 char 指针:
这是我的函数,它将这些指针作为输入:
我在 strncpy 期间遇到分段错误。怎么来的?我想要的结果是返回指向包含 helmutDownforce 的字符串的指针的函数。
c++ - std::ptrdiff_t' 尚未声明
我已经制作了自己的源文件,并且正在尝试添加 stddef.h。编译时出现以下错误:
std::ptrdiff_t' 尚未声明。
我做错了什么?
java - 如何在 SWIG 生成的 Java 包装器中处理 ptrdiff_t?
我在 C 中有这个结构:
但是,SWIG 生成的 Java 代码是:
我希望将ptrdiff_t
其转换为long
Java,而不是 this SWIGTYPE_p_ptrdiff_t
,在其中我无法访问实际long
值。
如何在 SWIG 中控制它?
c++ - ptrdiff_t 可以表示指向同一数组对象的元素的指针的所有减法吗?
对于指针i
和j
同一数组对象的元素的减法,[expr.add#5] 中的注释如下:
[ <em>注意:如果值i-j不在 type 的可表示值范围内
std::ptrdiff_t
,则行为未定义。— <em>结束注释]
但是鉴于[support.types.layout#2],它指出(强调我的):
- 该类型
ptrdiff_t
是实现定义的有符号整数类型,可以保存数组对象中两个下标的差异,如[expr.add]中所述。
结果是否甚至可能i-j
不在 的可表示值范围内ptrdiff_t
?
PS:如果我的问题是由于我对英语的理解不佳引起的,我深表歉意。
编辑:相关:为什么数组的最大大小“太大”?
c - 对于遍历数组,我们应该使用 size_t 还是 ptrdiff_t?
在Andrey Karpov 题为“关于和”的这篇博客文章中,size_t
ptrdiff_t
他展示了一个例子,
但是,我不确定这是否正确,似乎应该是
这个对吗?
我知道我们也应该使用类似的东西memset
,但让我们完全避免这种情况。我只问类型