【问题标题】:Function running when it shouldn't函数在不应该运行时运行
【发布时间】:2020-02-18 08:32:42
【问题描述】:

我有以下sn-ps的代码:

struct TreeNode *allocate_node(char *value) {
  struct TreeNode *new_node = malloc(sizeof(struct TreeNode));
  new_node->value = value;
  new_node->sibling = NULL;
  new_node->child = NULL;
  return new_node;
}
void tree_insert(struct TreeNode *root, char **values) {

  struct TreeNode *prev = root;
  struct TreeNode *curr = prev->child;


  for (int i = 0; i < 4; i++) {
    if (!curr) {
      prev->child = allocate_node(values[i]);

      prev = prev->child;
      curr = prev->child;
    }
  }
}
int main(void) {
  struct TreeNode root;
  root.value = "";
  root.child = NULL;
  root.sibling = NULL;

  char *command1[] = {"a", "b", "c", "d"};
  char *command2[] = {"e", "f", "g", "h"};

  tree_insert(&root, command1);
  tree_insert(&root, command2);

  printf("Printing current tree values: \n");
  struct TreeNode *curr = root.child;
  while (curr) {
    printf("%s ", curr->value);
    curr = curr->child;
  }
}

预期输出:

Current tree values:
a b c d

实际输出:

Current tree values:
e f g h

运行第一个 tree_insert 后,我​​的树的链接如下: (根) -> a -> b -> c -> d

但是当第二个 tree_insert 运行时,我的旧树似乎已被替换,即使 tree_insert 甚至不应该运行。新树是这样的: (根) -> e -> f -> g -> h

既然在第二个 tree_insert 中,curr 不再是 NULL,为什么它还在运行并覆盖我的树?我对 C 很陌生,所以我可能会遗漏一些非常明显的东西

编辑: TreeNode 是这样定义的:

struct TreeNode {
    char *value;
  struct TreeNode *sibling;
  struct TreeNode *child;
};

【问题讨论】:

  • C 还是 C++? TreeNode又是如何定义的?
  • 另外,你说链表的样子。你怎么知道的?我在您的代码中没有看到任何打印输出。
  • 您应该创建一个minimal reproducible example 并说明预期和实​​际行为。
  • 用最少的打印输出编辑您的主要功能以显示问题。告诉我们它打印了什么。告诉我们您希望它打印什么。

标签: c


【解决方案1】:
new_node->value = value;

这一行让我相信您将指针 value 存储在结构中。

这里的问题是指针存储在结构中。该指针指向其他一些位置,通常在堆栈中。当这个变量改变时,结构中的数据也会改变。

您可以将数据以数组的形式存储在结构中,也可以使用动态内存分配来存储数据。

对于动态内存分配,函数allocate_node修改如下。

struct TreeNode *allocate_node(char *value) {
  struct TreeNode *new_node = malloc(sizeof(struct TreeNode));
  int len = strlen(value);
  new_node->value = malloc(len +1);
  strcpy(new_node->value, value);
  new_node->sibling = NULL;
  new_node->child = NULL;
  return new_node;
}

要存储在数组中,需要提前知道value的最大长度。在这种情况下,需要进行以下更改。

struct TreeNode {
  char value[MAXLEN + 1];
  struct TreeNode *sibling;
  struct TreeNode *child;
};

struct TreeNode *allocate_node(char *value) {
  struct TreeNode *new_node = malloc(sizeof(struct TreeNode));
  strcpy(new_node->value,value);
  new_node->sibling = NULL;
  new_node->child = NULL;
  return new_node;
}

【讨论】:

  • 这解决了我的问题。非常感谢。
  • 您可以将mallocstrcpy替换为new_node-&gt;value = strdup(value);
  • @Rishikesh Raje 仍将输出作为当前树值:a b c d。 ideone.com/AKTaxa
  • 即使他在他的结构中使用指针,这也不会导致他的问题(但至少应该是const char* 我猜)。但是他发布的代码无论如何都符合他的预期,所以他犯了一些我们无法弄清楚的其他错误
猜你喜欢
  • 2022-06-11
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多