2016-10-04 76 views
0

我尝试添加一个字符串动态分配的元素,但有一件事在我的功能“ajouter_element”“add_element”它在malloc的,但我不知道它是如何工作的与charactere阵列动态分配

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(&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(&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(&liste,valeur); 

    afficher_liste(liste); 

    return 0; 
} 
+0

什么是你的问题吗? 'chaine'的类型是什么?显示所有类型会更好。 –

回答

0

,因为有些信息猜测的一点缺失:

chaine很可能是一个01一个typedef(看到value分配主程序)

当你这样做:

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

你分配一个元素。但是你不会为val char数组初始化内存。所以下面的说法:

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

可能因为listeCourante->val有未定义的值而崩溃。

你要做的:

​​

代替。所以内存分配恰到好处,输入字符串被复制。

注意:你可以有定义typedef char chaine[20];而不是typedef char * chaine;

让你的工作方案(以及main功能下降的val malloc的,用scanf("%19s",val)避免溢出缓冲区...)