#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)
, чтобы избежать переполнения буфера …)