问题标签 [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.

0 投票
5 回答
877 浏览

c - 结构成员之间的指针差异?

C99 标准规定:

当两个指针相减时,都应指向同一个数组对象的元素,或者指向数组对象的最后一个元素

考虑以下代码:

这显然违反了上述规则,因为pandq指针指向不同的“数组对象”,并且根据规则,q - p差异是未定义的。

但在实践中,为什么这样的事情会导致未定义的行为?毕竟,结构成员是按顺序排列的(就像数组元素一样),成员之间有任何潜在的填充。诚然,填充量会因实现而异,这会影响计算的结果,但为什么该结果应该是“未定义的”?

我的问题是,我们可以假设标准只是“无知”这个问题,还是有充分的理由不扩大这条规则?上述规则不能改写为“两者都应指向同一数组对象的元素或同一结构的成员”吗?

我唯一的怀疑是分段内存架构,其中成员可能最终位于不同的段中。是这样吗?

我也怀疑这就是 GCC 定义自己的原因__builtin_offsetof,以便对offsetof宏进行“符合标准”的定义。

编辑:

正如已经指出的那样,标准不允许对 void 指针进行算术运算。它是一个 GNU 扩展,仅在通过 GCC 时才会发出警告-std=c99 -pedantic。我正在用void *指针替换char *指针。

0 投票
2 回答
237 浏览

c++ - 在用户定义的类型上使用 std::ptrdiff_t

我有一个名为 node 的简单结构,它包含一个值 + 2 个指向下一个/上一个节点的指针。

这里我们有在末尾添加一个新节点的函数。

我们主要创建 100 个链接节点,每个节点都有一个唯一的 int 值。

这是指向第一个/最后一个节点的指针:

尝试应用指针算术时,麻烦就开始了:

不知何故node_sum == 528,如果我进行x32编译,那么node_sum == 781。

为什么 node_sum 不是 100 ?

0 投票
3 回答
1091 浏览

c - 我应该将 size_t 转换为 ptrdiff_t 吗?

我有一个 malloc 的指针数组,形成一个哈希表。要逐步遍历哈希表,我会使用指针算术,例如:

问题是我应该将size_t返回的sizeof()to 转换ptrdiff_t为条件的增量部分中的正确添加for吗?还是加起来有关系?

0 投票
1 回答
1128 浏览

c++ - C++ size_t 和 ptrdiff_t 用于负数组索引

我很难在索引类型之间进行选择size_tptrdiff_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_tptrdiff_t都是 64 位,但一个是unsigned另一个是signed

以下是我想出的解决方案,但遗憾的是它们都不是完美的:

  1. 在构造函数中,接受 type 的长度ptrdiff_t而不是size_t,并添加一个检查以验证给定的长度是否为负数。

    优点:它解决了这个问题,因为现在我将能够访问数组中的所有元素,并且仍然允许负索引。

    缺点:它限制了数组的最大可能长度。(例如,就像我之前说的,在我的机器中它减半)

  2. 保持原样,但在 中[] operator,将索引转换为 type size_t,并利用负值会溢出的事实。

    即到给定的索引,添加我们当前指向的元素和

    例如,在我之前的示例中,由于 vec2 指向数组中的第二个元素,因此[] operator看起来像

    优点:我们现在可以访问数组中的所有元素。

    缺点:使用变得笨拙和丑陋。例如,如果我们创建一个 size 的向量std::numeric_limits<std::size_t>::max(),那么为了访问最后一个元素,我们需要访问 '-1' 元素:

    /li>
0 投票
1 回答
296 浏览

c++ - __PTRDIFF_TYPE__ 的跨平台版本

是否有跨平台的方法来确定是否与预处理ptrdiff_t相同longlong long在预处理期间?

我知道__PTRDIFF_TYPE__应该用 gcc/g++ 给出类型,但它似乎没有在 Windows 的 VC/VC++ 中定义。有比以下更好的方法吗?

如果在预处理期间不可能,是否有编译时方法?我正在寻找一个非 C++11 的解决方案,但如果你有一个非常好的现代解决方案,请随时分享!

0 投票
2 回答
635 浏览

c - 在C中将字符串的一部分复制到另一部分

我在尝试将字符串的一部分复制到另一部分时遇到问题。鉴于这两个 char 指针:

这是我的函数,它将这些指针作为输入:

我在 strncpy 期间遇到分段错误。怎么来的?我想要的结果是返回指向包含 helmutDownforce 的字符串的指针的函数。

0 投票
1 回答
2082 浏览

c++ - std::ptrdiff_t' 尚未声明

我已经制作了自己的源文件,并且正在尝试添加 stddef.h。编译时出现以下错误:

std::ptrdiff_t' 尚未声明。

我做错了什么?

0 投票
1 回答
80 浏览

java - 如何在 SWIG 生成的 Java 包装器中处理 ptrdiff_t?

我在 C 中有这个结构:

但是,SWIG 生成的 Java 代码是:

我希望将ptrdiff_t其转换为longJava,而不是 this SWIGTYPE_p_ptrdiff_t,在其中我无法访问实际long值。

如何在 SWIG 中控制它?

0 投票
2 回答
740 浏览

c++ - ptrdiff_t 可以表示指向同一数组对象的元素的指针的所有减法吗?

对于指针ij同一数组对象的元素的减法,[expr.add#5] 中的注释如下:

[ <em>注意:如果值i-j不在 type 的可表示值范围内std​::​ptrdiff_­t,则行为未定义。— <em>结束注释]

但是鉴于[support.types.layout#2],它指出(强调我的):

  1. 该类型ptrdiff_­t是实现定义的有符号整数类型,可以保存数组对象中两个下标的差异,如[expr.add]中所述。

结果是否甚至可能i-j不在 的可表示值范围内ptrdiff_t

PS:如果我的问题是由于我对英语的理解不佳引起的,我深表歉意。

编辑:相关:为什么数组的最大大小“太大”?

0 投票
3 回答
929 浏览

c - 对于遍历数组,我们应该使用 size_t 还是 ptrdiff_t?

在Andrey Karpov 题为“关于的这篇博客文章中,size_tptrdiff_t他展示了一个例子,

但是,我不确定这是否正确,似乎应该是

这个对吗?

我知道我们也应该使用类似的东西memset,但让我们完全避免这种情况。我只问类型