0

History 型の構造体をパラメーターとして受け取る関数を作成しました。構造体には char 2d 配列が含まれており、そのサイズは動的に割り当てられます。

だからここに関数があります:

void appendLine(Historique** hist, const char* str){

    int size, i, sizestr;

    size=(*hist)->size;
    sizestr=strlen(str);

    History* tmp;

    tmp=NULL;
    tmp=(struct History*)malloc(sizeof(hist));

    copyHist(&tmp, *hist);

    freeHist(*hist);

    *hist=NULL;

    *hist=(struct History*)malloc(sizeof(History));

    (*hist)->size=tmp->size;

    if(((*hist)->line=(char**)malloc(sizeof(char)*size+sizeof(char)))==NULL){
        printf("ERROR !");
        exit(EXIT_FAILURE);
    }

    if((((*hist)->ligne)[taille]=(char*)malloc(sizeof(char)*strlen(str)+sizeof(char)))==NULL){
        printf("ERROR !");
        exit(EXIT_FAILURE);
    }

    for(i=0; i<taille; i++){
        (*hist)->ligne[i]=(char*)malloc(sizeof(char)*strlen(tmp->line[i])+sizeof(char));
        memcpy((*hist)->ligne[i], (tmp->line)[i], sizeof(char)*strlen(tmp->line[i]));
        (*hist)->line[i][strlen(tmp->line[i])]='\0';
    }

    for(i=0;i<sizestr;i++){
        (*hist)->line[size][i]=str[i];
    }   

    (*hist)->line[size][strlen(str)]='\0';

    (*hist)->size+=1;

    tmp=NULL;
}

void copyHist(History** dest, const History* src) {
    int i,j;
    (*dest)->line=NULL;
    (*dest)->line=(char **)malloc(sizeof(char)*src->size);
    for(i=0; i<src->size; i++){
        if(((*dest)->line[i]=malloc(sizeof(char)*strlen(src-   >line[i])+sizeof(char)))==NULL){
            printf("ERROR!");
            exit(EXIT_FAILURE);
        }
        for(j=0;j<strlen(src->line[i]);j++){
            (*dest)->line[i][j]=(src->line)[i][j];
        }   
        (*dest)->line[i][j]='\0';
    }
    memmove(&((*dest)->size), &(src->size), sizeof(int));
}

void freeHist(History* arg){
    int i;

    for(i=0; i<arg->size; i++){
        free(arg->line[i]);
        arg->line[i]=NULL;
    }
    free(arg);
    arg=NULL;
}

したがって、いくつかの行を次々に追加すると、行にindex 0正しいものが表示されないことを除いて、すべて正常に動作するようです。

ご心配ありがとうございます

4

0 に答える 0