为什么一个指针有两个不同的内存地址C

为什么一个指针有两个不同的内存地址C,c,pointers,memory,nodes,allocation,C,Pointers,Memory,Nodes,Allocation,一些上下文。。我正在尝试用C语言创建动态树,基本上已经完成了 问题是,目前,我遇到了一个分段错误,这似乎与将当前节点(结构“TABLEAU”)的指针传递给函数有关 将TABLEAU*current传递到addNewBetaNodes()时,我尝试一次性打印当前节点的地址(打印是为了调试-我没有其他方法来了解发生了什么事情) 但是,我在运行程序时得到以下输出: addNewBetaNodes *current = 0x7f9b45c02c20 addNewBetaNodes *current =

一些上下文。。我正在尝试用C语言创建动态树,基本上已经完成了

问题是,目前,我遇到了一个分段错误,这似乎与将当前节点(结构“TABLEAU”)的指针传递给函数有关

将TABLEAU*current传递到addNewBetaNodes()时,我尝试一次性打印当前节点的地址(打印是为了调试-我没有其他方法来了解发生了什么事情)

但是,我在运行程序时得到以下输出:

addNewBetaNodes *current = 0x7f9b45c02c20
addNewBetaNodes *current = 0x7f9b45c02c50
出于某种原因,现在一个指针有两个不同的内存地址

有人能解释一下为什么会这样吗。非常感谢

void addNewBetaNodes(TABLEAU *current, char *subStringLeft, char *subStringRight) {


printf("addNewBetaNodes *current = %p\n", (void *)current);

  if((current->left == NULL) && (current->right == NULL) && (current->straight == NULL)) { //IF NODE IS LEAF
    current->left = new_leaf(current, subStringLeft);
    current->right = new_leaf(current, subStringRight);
    printf("Made new beta nodes: %s   AND: %s\n", (current->left->formula), (current->right->formula));
    printf("addNewBetaNodes() Current: %p\n", (void *)current);
    printf("addNewBetaNodes() Current->left: %p, Current->right: %p\n", (void *)current->left, (void *)current->right);
  }

  else if((current->straight != NULL) && (current->left == NULL) && (current->right == NULL)) { //IF NODE IS UNARY
    addNewBetaNodes(current->straight, subStringLeft, subStringRight);
  }

  else if((current->left != NULL) && (current->right != NULL) && (current->straight == NULL)) {
    addNewBetaNodes(current->left, subStringLeft, subStringRight);
    addNewBetaNodes(current->right, subStringLeft, subStringRight);
  }
}
printf()将current的内容打印为指针,没有理由期望不同函数调用之间的current相同。事实上,对于这个函数,我希望current的内容会有所不同


即使要打印¤t,得到不同的结果也不足为奇,这取决于当前变量恰好落在堆栈上的位置。

包括一个真正的如何调用
addNewBetaNodes()
?注:“TABLEAU”在英语中是“array”的意思;)我打赌指针在两个打印中有两个不同的地址,因为您在两个打印之间更改了指针。麦克维,你调用了两次函数。你只得到了你的第一个printf(如果称第二个printf为'true'的话)。第一个有“current”,第二个有“current”,用所有警告和调试信息编译你的程序,所以
gcc-Wall-Wextra-g
with。对其进行改进,使其不会收到警告。使用调试器,也许还可以。对于下一个问题,请提供一些。当前的不清楚,因为没有任何。@Yunnosch我不打印指针的内容,我打印内存地址,只打印一次。然而,令人惊讶的是,它被打印了两次。“current”指针除了打印之外没有其他任何变化,因此没有任何理由打印两次。我不会在任何地方更改指针。我所期望的是,传入函数的指针的地址会打印为传入函数之前的地址。然而,当我试图打印地址时,我想看看发生了什么。。其中一个地址与传递的指针的地址匹配,但由于未知原因,还会打印另一个地址。我想问的问题是为什么:(谢谢你的时间!
void addNewBetaNodes(TABLEAU *current, char *subStringLeft, char *subStringRight) {


printf("addNewBetaNodes *current = %p\n", (void *)current);

  if((current->left == NULL) && (current->right == NULL) && (current->straight == NULL)) { //IF NODE IS LEAF
    current->left = new_leaf(current, subStringLeft);
    current->right = new_leaf(current, subStringRight);
    printf("Made new beta nodes: %s   AND: %s\n", (current->left->formula), (current->right->formula));
    printf("addNewBetaNodes() Current: %p\n", (void *)current);
    printf("addNewBetaNodes() Current->left: %p, Current->right: %p\n", (void *)current->left, (void *)current->right);
  }

  else if((current->straight != NULL) && (current->left == NULL) && (current->right == NULL)) { //IF NODE IS UNARY
    addNewBetaNodes(current->straight, subStringLeft, subStringRight);
  }

  else if((current->left != NULL) && (current->right != NULL) && (current->straight == NULL)) {
    addNewBetaNodes(current->left, subStringLeft, subStringRight);
    addNewBetaNodes(current->right, subStringLeft, subStringRight);
  }
}