【问题标题】:Storing a string in C for an AVL tree在 C 中为 AVL 树存储字符串
【发布时间】:2017-07-27 20:22:11
【问题描述】:

我有一个项目需要为 AVL 树存储两个变量:一个词和它的使用率:

struct AVLnodo {
  float peso;
  int FB;
  char *palavra;
  struct AVLnodo* esq;
  struct AVLnodo* dir;
};

注意:

比索=使用率

palavra=word

其他变量是指向子元素和平衡因子的指针。

问题出在下面的代码中:

wordTree* InsereAVL (wordTree *a, float peso, char *word, int *ok)
{
if (a == NULL)
  {
     a = (wordTree*) malloc(sizeof(wordTree));
     a->peso = peso;
     a->palavra = NULL;

     //1----->  strcpy(a->palavra,word);
     //2----->  a->palavra=word;

     a->esq = NULL;
     a->dir = NULL;
     a->FB = 0;
     *ok = 1;
 }
 else
 if (peso < a->peso)
 {
       ...
 }
 else
 {
       ...
 }
 return a;
}

复制字符串的正确方法是使用strcpy,如1所示,但是这样会导致执行错误。

当使用 2 时,代码有效,但每个节点的结构上的 word 字段存储在相同的地址,即所有节点在 peso(使用率)上具有不同的数字,但在 palavra 上具有相同的词( word),这是添加到树中的最后一个单词。

我不知道如何解决这个问题。希望有人知道如何解决它。

谢谢。

【问题讨论】:

  • a-&gt;palavra = NULL; strcpy(a-&gt;palavra,word); 不好。没有分配给a-&gt;palavra 的内存。建议a-&gt;palavra = strdup(word);。您稍后负责free(a-&gt;palavra)
  • "复制字符串的正确方法是使用strcpy" 是的,但是复制它在哪里?您首先需要内存来保存副本,并且它不会在 (AVL) 树上生长。
  • 我认为使用a = (wordTree*) malloc(sizeof(wordTree)); 也会为字符串分配内存,现在确实解决了这个问题。谢谢
  • 谁或什么文字建议转换malloc()的结果?
  • @LaposhasúAcsa 见Do I cast the result of malloc?

标签: c string pointers avl-tree


【解决方案1】:

复制word前需要先分配内存:

a-&gt;palavra = malloc(strlen(word)+1);

【讨论】:

  • 我这样做了,它奏效了!我用a = (wordTree*) malloc(sizeof(wordTree)); 以为它也会为字符串字段分配内存,谢谢你的帮助!
  • malloc(sizeof(wordTree)); 只为您的结构分配足够的内存。指针表示与它们所指的类型不同的类型。请注意,指针大小可能因各种架构而异。
【解决方案2】:

我认为您需要在 strcpy 到 a-&gt;palavra 之前分配内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多