【问题标题】:Storing difference in value between two pointers存储两个指针之间的值差异
【发布时间】:2019-12-17 17:07:09
【问题描述】:

试题图片:

所以问题要我们存储下一个节点和前一个节点的内存位置之间的差异。

struct sub_node{
   float data;
   int sub_value; //memory address of next node - previous node
};

这是我为每个节点制作的结构。这适用于除最终节点和起始节点之外的所有节点。我可以通过简单地计算下一个节点地址

struct node * next = node_current->sub_value + node_prev; //node_prev is 
        //memory address of the previous node(pointer)

在尝试向后遍历时也是如此。

&NEXT_NODE - 0 将其存储为整数值时给我一个错误。 (参见图片进行描述)同样,0 - &SECOND_LAST_NODE 也给了我这个错误。我想知道解决这个问题的最佳方法是什么。 (不强制转换的指针的整数)

【问题讨论】:

  • “给我一个错误” - 哪个错误,究竟是什么?
  • @ForceBru "警告:从 'struct sub_node *' 分配给 'int' 使得指针从没有强制转换的整数 [-Wint-conversion]" 和 "无效的操作数到二进制 - (有 'int'和 'struct sub_node *') d->sub_value = 0 - c;"当试图使 d 的减法值为 0-c 时
  • 请注意,当从数组中分配元素时,这种链接列表效果最好,这在 Fortran 中经常发生。然后,增量可以是记录计数而不是原始指针值,并且增量大小可以限制为底层数组的大小。
  • 这种数据结构在标准 C 中是不可能的,因为它未定义对指向不同对象的指针执行算术运算。这只有在所有节点都从单个数组中分配时才有效(这对于链表来说是非典型的)。
  • @GemTaylor 我明白了。鉴于 LinkedList 已经充满了节点并且考试是在纸上进行的(这是我正在尝试练习的去年的考试),这个问题只是想让我们实施方法。我只是想在机器上实现它,以及应该将增量存储在哪种原始类型中。如果它是增量,即。一个地址 - 另一个地址可以正常工作。当它是原始指针值(即第一个和最后一个元素)时就会出现问题

标签: c pointers


【解决方案1】:

您可以使用ptrdiff_t 类型,其用例正是这个。它在<stddef.h>中定义。

【讨论】:

  • size_tuintptr_t(在以后的标准中) - 表示数组元素或指针之间的差异所需的整数类型。
  • 好点!我对是否包含数字类型犹豫不决,因为它们可以通过实现而改变,但我想有人指出它们是一种可能性是件好事 :)
  • 它们在 C 标准中,所以应该是可靠的。
  • int* 保证与其他类型的指针具有相同的大小。 void* is 保证能够表示任何类型的指针(但这不是唯一的问题)。
  • @TobySpeight 谢谢,我会编辑我的答案。另外,“不是唯一的问题”是什么意思?
【解决方案2】:

这段代码有两个问题。

首先,sub_value 是一个int,它的范围可能不足以存储指针之间的差异。请参阅 the answer by Saucy Goat 以获取解决此问题的建议。

其次,指针运算仅针对指向 C 中同一对象内的指针定义。因此,我们需要使用减法来代替整数类型。为此,有uintptr_t 类型:

struct sub_node{
   float data;
   uintptr_t sub_value; // relative position of next node
};
    uintptr_t next_as_int = node_current->sub_value + (uintptr_t)node_prev;
    struct node *next = (struct node*)next_as_int;

你的 0 减法是明确定义的,因为 0 是一个完全合理的 uintptr_t 值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多