C 存储两个指针之间的值差

C 存储两个指针之间的值差,c,pointers,C,Pointers,考试题的图片: 因此,问题需要我们存储下一个节点和前一个节点的内存位置之间的差异 struct sub_node{ float data; int sub_value; //memory address of next node - previous node }; 这是我为每个节点制作的结构。这适用于除最终节点和起始节点之外的所有节点。我可以简单地计算下一个节点的地址 struct node * next = node_current->sub_value + node_

考试题的图片:

因此,问题需要我们存储下一个节点和前一个节点的内存位置之间的差异

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\u LAST\u节点
也会给出该错误。我想知道解决这个问题的最佳方法是什么。(不带强制转换的整数到指针)

您可以使用该类型,其用例正是此类型。它是在

中定义的。此代码有两个问题

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

第二,指针算法只为C中指向同一对象的指针定义。因此,我们需要使用减法来处理整数类型。为此,有
uintptr\t
类型:

struct sub_node{
   float data;
   uintptr_t sub_value; // relative position of next node
};

然后,您与0的减法就得到了很好的定义,因为0是一个非常合理的
uintpttr\u t
值。

“给了我一个错误”-确切地说是哪个错误?@ForceBru“警告:从“struct sub_node*”赋值到“int”会从指针生成整数,而无需强制转换[-Wint转换]”和“无效操作数到二进制-(具有“int”和“struct sub_node*)d->sub_value=0-c当试图使d的减法值为0时,请注意,这种链接列表在从数组中分配元素时效果最佳,这在Fortran中经常发生。然后,增量可以是记录计数而不是原始指针值,并且增量大小可以限制为基础数组的大小。这种数据结构不可能在标准C中是不可定义的,因为在指向不同对象的指针上执行算术是不可定义的。这只能在所有节点都从单个数组中分配时起作用(这对于链表来说是不典型的)。@GemTaylor我明白了。这个问题只是想让我们实现一些方法,因为LinkedList中已经填充了节点,并且考试是书面的(这是我试图练习的去年的考试)。我只是想在一台机器上实现它,以及delta应该存储在什么样的基元类型中。如果它是delta,即一个地址-另一个地址,它工作正常。当它是一个原始指针值(即第一个和最后一个元素)时,问题就会出现或者后来的标准中的
size\u t
uintpttr\u t
——表示数组元素或指针之间差异所需的整数类型。要点很好!我不太愿意包含数字类型,因为它们可以通过实现进行更改,但我想最好有人指出它们的可能性:)它们采用C标准,因此应该是可靠的。
int*
不保证与其他类型的指针具有相同的大小。
void*
保证能够表示任何类型的指针(但这不是唯一的问题)。@TobySpeight谢谢,我将编辑我的答案。还有,“不是唯一的问题”是什么意思?
    uintptr_t next_as_int = node_current->sub_value + (uintptr_t)node_prev;
    struct node *next = (struct node*)next_as_int;