0

データの構造は次のとおりです。

    struct variabile {
        char* nome;         
        char* contenuto;        
        struct variabile* next;     
        int tipo;           
    };

そしてここにコードがあります:

    struct variabile* pt = malloc (sizeof (struct variabile));
            pt->nome = $1; 
            pt->tipo = type; 
            pt->contenuto = $2; 
            pt->next=NULL;      


    if (testaVariabile == NULL) 
            testaVariabile=pt; 
    else {
            struct variabile* current = testaVariabile;


        while ((current->next)!=NULL){  

            if(strcmp(current->nome, pt->nome)==0)
                                    fprintf (stderr, "warning: clash di nome di variabili %s \n", current->nome);
            current=(current->next); 
        }
        (current->next)=pt; 

        if(strcmp(current->nome, pt->nome)==0) 
                fprintf (stderr, "warning: clash di nome di variabili %s \n", current->nome);
    }

これが変数testaVariabileの最初の宣言です。

       struct variabile* testaVariabile = NULL;

コードの最後の行でcurrentの次の値を更新しようとすると、セグメンテーション違反エラーが発生します。また、コードがwhileサイクルに入っていないことも確認しました。

私はCにかなり慣れていないので、答えを説明してください。

ありがとうございました

編集

コードの残りの部分はFlexパーサーです。

編集

私の友人は、gdbを使用してデバッグするように教えてくれました。エラーが出てきたことが出てきます

       strcmp(current->nome, pt->nome)

間違った場所で問題を探すのに時間がかかって本当に申し訳ありませんが、CとFlexを使うのはこれが初めてです。

誰かがこの問題を取り除く方法を知っていますか?

わかりました、最後の更新。

チェックされた答えは問題を解決しました。ただし、この場合、レクサーがファイルから値を読み取る方法にもエラーがあったため、2つの部分からなる問題でした。

4

1 に答える 1

0

これを試して:

struct variabile* pt = malloc (sizeof (struct variabile));
pt->nome = malloc(strlen($1) + 1);
strcpy(pt->nome, $1); 
pt->tipo = type; 
pt->contenuto = $2; // maybe the same for this too?
pt->next=NULL;

/* rest of your code ... */

ただの野蛮な推測です

于 2013-03-14T02:41:28.213 に答える