3

リンクリストのノードをトラバースする簡単なプログラムを作成しました。

struct node
{
    int data;
    struct node *next;
}*start;
start=(struct node *)malloc(sizeof(struct node));
start->next=NULL;

int main(void)
{
    if(start==NULL)
    {
        printf("There are no elements in the list");
    }

    else
    {
        struct node *tmp;
        printf("\nThe elemnets are ");
        for(tmp=start;tmp!=NULL;tmp=tmp->next)
        {
            printf("%d\t",tmp->data);
        }
    }
    return 0;
}

リンクリストの要素を印刷しようとすると、リストが空であっても、出力が表示されます。

The elements are 5640144

私は何が間違っているのですか?開始ポインタを正しく宣言していますか?

なぜこれを行う必要があるのですか(実際、最初はこれを行っていませんでしたが、友人の1人から依頼されました)

start=(struct node *)malloc(sizeof(struct node));
start->next=NULL;
4

2 に答える 2

4

ノード()へのポインタを宣言してstartも、実際にはノード自体は作成されません。これを行う必要がありmalloc()ます。ただし、malloc()ノードを適切な値で埋める必要はありません。そのため、で一見ランダムな値を取得しますdatastart->data = 42;後に試してくださいstart->next = NULL;

malloc()編集:関数の外部から呼び出さないことについてのArjunShankarのコメントを参照してください。

于 2012-07-13T14:35:07.230 に答える
1

現在、割り当てられたstart-> next = NULLのように、割り当てられたメモリブロックに存在するガベージ値を確実に提供している可能性があります。データに値が割り当てられていない、

親切に0でmemsetを使用してください、それは構造全体のためにゼロでメモリブロックを初期化するか、構造にいくつかの値を初期化します。

gccを使用した場合は、この問題は発生しなかった可能性があります。これについては、発生しなかったと思います。

structはグローバルであり、startは構造体へのポインタです。mallocの時点で、構造体サイズのメモリが割り当てられ、初期化されています。グローバル構造変数を取得した場合、 bssで初期化されるため、このような問題に直面することはありません。

#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node *next;
}*start;

int main(void)
{
start=(struct node *)malloc(sizeof(struct node));
start->next = NULL;
start->data = 100;
//memset(start,0,sizeof(struct node));
if(start==NULL)
{
    printf("There are no elements in the list");
}
else
{
    struct node *tmp;
    printf("\nThe elemnets are ");
    for(tmp=start;tmp!=NULL;tmp=tmp->next)
    {
        printf("%d\n",tmp->data);
    }
}
return 0;
}
于 2012-07-13T14:45:08.553 に答える