使用charactere数组进行动态分配

时间:2016-10-04 20:03:25

标签: 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(&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;
}

1 个答案:

答案 0 :(得分:0)

由于缺少一些信息,有点猜测:

chaine很可能是char *上的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有未定义的值。

你必须这样做:

listeCourante->val = strdup(val);

代替。因此,内存分配正确,输入字符串将被复制。

注意:您可以通过定义typedef char chaine[20];代替typedef char * chaine;

来使您的计划有效

(并在val函数中删除main的malloc,使用scanf("%19s",val)以避免溢出缓冲区......)