1

以下に添付された画像からわかるように、リストの一番上から 2 番目の要素を追加すると、printf 関数に奇妙な動作が生じます。

リストノードを追加する関数は次のとおりです。

void add_QUEUEnode_top(Item a)
{
    if (head==NULL)
    {
        QUEUEinit(a);
    }
    else
    {
        QUEUEput_top(a);
    }
    return;
}

void QUEUEinit(Item a)
{
    head=(link)malloc(sizeof(link*));
    head->next=NULL;
    head->item=a;
    tail=head;
    printf("Coda iniziallizata...\n\n");

}

void QUEUEput_top(Item a)
{
    link tmp;
    tmp=(link)malloc(sizeof(link*));
    tmp->item=a;
    tmp->next=head;
    head=tmp;
    return;
}

アイテムを処理する関数は次のとおりです。

Item fill_item()
{
    Item a;
    int i;
    for(i=0; i<DIM-1; i++)
    {
        a.stringa[i]=rand();
    }
    a.stringa[DIM-1]='\0';
    a.numero=rand();
    printf("\nOggetto generato: \n");
    print_item(a);
    return a;
}

void print_item(Item a)
{
    printf("\nStringa elemento: ");
    printf("%s", a.stringa);
    printf("\nNumero elemento:  %d\n", a.numero);
}

ここに、私が編集しているコードブロック プロジェクトへのリンクがあります。print_item(Item a)「バグのある」printf を呼び出す関数はモジュール内にありますitem.cが、リスト項目を生成する関数はlist.cモジュール内にあります。

この問題の原因は何ですか?

スタックの最初の要素に入る

そしてそれが2番目の要素で起こることです

PS: イタリア語のキャプチャで申し訳ありません

編集: 項目の定義:

typedef struct
{
    char stringa[DIM];
    int numero;
} Item;

リンク ポインターの定義:

typedef struct QUEUEnode *link;

リンク構造の定義:

struct QUEUEnode
    {
        Item item;
        link next;
    };
4

2 に答える 2

4

あなたにはいくつかのバグがあります - 私はあなたのためにそれらを調べて見つけようとしますが、あなたが尋ねている特定の問題はこのコードに関連しています:

for(i=0; i<DIM-1; i++)
{
    a.stringa[i]=rand();
}
a.stringa[DIM-1]='\0';

各文字に乱数を入れているだけです。それらの多くは、文字セットで面白くないか、印刷可能な文字でさえない場合があります。それが、あなたが見ているクレイジーな出力を得る理由です。ランダムな印刷可能な文字を文字列に入れたい場合は、より文字セットを意識した方法で行ってください。

さらにいくつかの問題:

  1. これらの配賦ラインは間違っています:

    head=(link)malloc(sizeof(link*));
    tmp=(link)malloc(sizeof(link*));
    

    彼らはする必要があります:

    head = malloc(sizeof(struct QUEUEnode));
    tmp = malloc(sizeof(struct QUEUEnode));
    

    つまりstruct QUEUEnode、ポインタだけでなく、全体に十分なサイズを割り当てる必要があります。(または、あなたが持っていたものへのポインタへのポインタ)。ポインタ型を a のtypedefように非表示にすることはtypedef struct QUEUEnode *link;、物議を醸すスタイルの選択の 1 つです。個人的には、このような問題を非常に迅速に混乱させるため、そうしないことを好みます。

  2. このプログラムでは、多くの構造体を値渡ししています。それは問題なく有効な C ですが、少し慣用的ではありません。通常、人々は代わりにポインターを渡します。構造体がかなりのサイズになると、すべての暗黙的なメモリ コピーが行われるため、パフォーマンスが著しく低下し始める可能性があります。

于 2013-05-04T15:38:48.743 に答える