【问题标题】:How to allocate memory of a string in a linked list?如何在链表中分配字符串的内存?
【发布时间】:2021-12-27 13:52:13
【问题描述】:

我尝试使用 strcpy 在我的链表中添加一个 char 数组,但在这种情况下我遇到了分段错误。我知道如何为 int 分配内存,但对 char 数组有问题。我们是否需要特别为链表的每个字符数组使用 malloc?这是我的代码:

typedef struct Avion Avion;
struct Avion
{
    char *NomAvion;
    char *NomCompanie;
    int Carburant;
    int place;
    Avion *suivant;
};

typedef struct Liste Liste;
struct Liste
{
        Avion *premier;
};

void AjouterUnAvion(Liste *liste)
{   
        char nomAvion1[20] = "defaultNomAvion";
        char nomCompanie1[20] = "defaultNomCompanie" ;
        scanf("%s",nomAvion1);
        scanf("%s",nomCompanie1);
        if(liste == NULL)
        {
            exit(EXIT_FAILURE);
        }
        Avion *nouvAv = malloc(sizeof(*nouvAv));
        strcpy(nouvAv->NomAvion,nomAvion1);
        strcpy(nouvAv->NomCompanie,nomCompanie1);
        
        Avion *current = malloc(sizeof(*current));
        current = liste->premier;
       
        while(current->suivant != NULL)
        {
            current = current->suivant;
        }
        current->suivant = nouvAv;
}

int main()
{
    Liste *liste = initialisationListe();
    AjouterUnAvion(liste);
    return 0;
}

【问题讨论】:

  • 结构 Avion 中有两个指针。您应该为它们分配空间(以便使用strcpy)或使其指向您之前读取的数组。
  • 考虑使用nouvAv->NomAvion = strdup(nomAvion1); 你不能存储指向nomAvion1 的指针,因为它会超出范围和寿命。

标签: c linked-list


【解决方案1】:

详细说明我刚刚发表的评论,当您调用Avion *nouvAv = malloc(sizeof(*nouvAv)); 时,它不会为结构内的指针分配空间(我相信您需要 20 个字符用于名称和公司,对吗?)。你可以:

  • 使这些结构成员固定大小 - 比如char nom_avion[20]
  • 为它们每个分配空间,调用 malloc(或任何其他为您分配足够内存的函数)
  • 使用等号运算符使其指向现有和已分配的永久数组(请注意,例如,当您在函数中创建它时,可以清除内存,然后指针将指向任何地方)

【讨论】:

  • 感谢您的回答。我已经修复了我的代码并理解了这个问题。
  • 感谢大家的反馈,我会尝试修正我的答案,使其更加清晰和正确。对不起,我做的有点匆忙..
  • 好的,我刚刚更新了它。如果您对我的回答有更多反馈,请随时添加。再次感谢!
猜你喜欢
  • 2015-07-01
  • 1970-01-01
  • 2012-07-10
  • 2011-03-22
  • 2023-03-25
  • 2021-07-27
  • 2021-01-28
  • 1970-01-01
  • 2022-12-23
相关资源
最近更新 更多