Динамическое выделение с помощью символьного массива

#c

#c

Вопрос:

Я пытаюсь добавить строку, динамически выделяющую элемент, но в моей функции «ajouter_element» «add_element» есть что-то в malloc, но я не знаю, как это работает

 void ajouter_element(liste* liste, chaine val){
    element* listeCourante;
    element* parcourt;
    parcourt = *liste; //Cette element sert de pointeur ppour parcourir la liste pour ne pas perde la tete de la liste
    listeCourante = (element*)malloc(sizeof(element)); // on alloue de la place dans cette liste
    strcpy(listeCourante->val,val); // puis on ajoute la valeur entrée au clavier dans ce nouvelle element
    listeCourante->svt=NULL; //comme on l'ajoute a la fin l'element suivant est donc NULL
    if(parcourt==NULL){
         *liste=listeCourante; //si la liste de depart est NULL on ajoute directement l'element
    }else{
         printf("pk");
         while(parcourt->svt!=NULL){//on parcourt la liste pour pouvoir ajouter a la fin il faut que le pointeur pointe sur le derniere element
            printf("pk");
            parcourt=parcourt->svt;
        }
        parcourt->svt=listeCourante;
    }
}
  

Мое главное убедиться, что программа работает

 int main(){

  liste liste;
  chaine valeur;
  valeur=(chaine)malloc(20*sizeof(char));
  initialisation(amp;liste);
  afficher_liste(liste);

  printf(" Entrez un mot (TAPEZ * POUR ARRETER LA BOUCLE) :   n");
  scanf("%s",valeur); //on lit la valeur a jouter au clavier
  while(strcmp(valeur,"*")!=0){ // * est le marqueur pour arreter la boucle
    printf("ca marche 2.0");
    ajouter_element(amp;liste,valeur);
    printf(" Entrez un mot (TAPEZ * POUR ARRETER LA BOUCLE) :   n");
    scanf("%s",valeur);
    printf("ca marche");
  }

  afficher_liste(liste);

  printf(" nEntrez le mot a supprimer :   n");
  scanf("%s",valeur);
  supprimer_element(amp;liste,valeur);

  afficher_liste(liste);

  return 0;
}
  

Комментарии:

1. в чем ваш вопрос? что это за тип chaine ? было бы лучше показать все типы.

Ответ №1:

Немного догадок, поскольку отсутствует некоторая информация:

chaine очень вероятно, что это typedef для a char * (см. Основную программу, где value выделяется)

Когда вы делаете это:

 listeCourante = (element*)malloc(sizeof(element)); // on alloue de la place dans cette liste
  

вы выделяете элемент. НО вы не инициализируете память для массива val символов. Итак, следующее утверждение:

 strcpy(listeCourante->val,val); // puis on ajoute la valeur entrée au clavier dans ce nouvelle element
  

вероятно, сбой, потому listeCourante->val что имеет неопределенное значение.

вы должны сделать:

 listeCourante->val = strdup(val);
  

вместо этого. Таким образом, память выделяется правильно, а входная строка копируется.

Примечание: вы могли бы заставить свою программу работать, определив typedef char chaine[20]; вместо typedef char * chaine;

(и отбросьте malloc val в main функции, используйте scanf("s",val) , чтобы избежать переполнения буфера …)