使用C指定地址时的混淆

使用C指定地址时的混淆,c,pointers,C,Pointers,我试图将一个名为node的结构的地址分配给另一个名为tmp的结构,该结构具有相同的node类型。然而,tmp的地址总是小于节点的地址8。为什么呢?谢谢 #include <stdio.h> #include <stdlib.h> typedef struct _node { int data; struct _node *next; }Node; int main() { Node *node = (Node*)ma

我试图将一个名为node的结构的地址分配给另一个名为tmp的结构,该结构具有相同的node类型。然而,tmp的地址总是小于节点的地址8。为什么呢?谢谢

  #include <stdio.h>
  #include <stdlib.h>

  typedef struct _node
  {
    int data;
    struct _node *next;
  }Node;

  int main()
  {
    Node *node = (Node*)malloc(sizeof(Node));
    Node *tmp;
    tmp = node;

    printf("%d\n",&node);
    printf("%d\n",&tmp);
  }

我猜您希望两行的输出相同

为此,您必须打印指针的值,而不是指针的地址

之后

tmp的值与node的值相同,但这两个变量的地址总是不同的

我猜你是想用:

printf("%p\n", node);  // Use %p for pointers, not %d
printf("%p\n", tmp);

可能的指针是平台上的8字节。因此,由于您一个接一个地分配了变量,它们之间的间隔为8字节。

您对指针类型变量的值与其地址之间的差异感到困惑。您可以通过赋值运算符在代码中更改变量的值:

tmp = node;
但变量的地址是其定义特征中最基本的。你不能改变这一点

您正在打印指针的地址——格式字符串中的字段描述符是错误的。要打印它们的值,请执行以下操作:

    printf("%p\n", (void *) node);
    printf("%p\n", (void *) tmp);

关键的区别当然是上面没有使用操作符&的地址。此外,打印指针值时需要%p字段描述符,但它专门用于void*值。这就是强制转换的原因。

您的系统将节点和tmp紧挨着存储在内存中,这并不奇怪,因为它们是紧挨着声明的。你期望地址的差异是什么?另外,不要抛出malloc的返回,这是没有必要的。请参阅:以获取详细解释。Node*Node=mallocsizeof*Node;“这就是我所需要的一切。”戴维施瓦茨在我一贴出来就注意到了这一点。
    printf("%p\n", (void *) node);
    printf("%p\n", (void *) tmp);