0

次のCプログラムがあります。次の行を含めると機能しますが、そうしないとセグメンテーション違反が発生します。

printf("head(%p), last(%p), newnode(%p)\n", head, last, newnode);

ここで何が問題なのか分かりますか?

これが私のプログラム全体です。これは基本的な循環キューの例です。

#include "stdio.h"
#include "malloc.h"

struct node {
    int data;
   struct node *next;
};

typedef struct node NODE;

void display(NODE *);

int main(void) {

    NODE *head, *last, *newnode = NULL;
    int i = 5;

    for ( ; i > 0; i--) {
        newnode = (NODE *) malloc(sizeof(NODE));
        newnode->data = i*10;
        newnode->next = NULL;

        //printf("head(%p), last(%p), newnode(%p)\n", head, last, newnode);


        if (head == NULL) {
            head = newnode;
            last = newnode;
        } else {
           last->next = newnode;
           last = newnode;
        }

        last->next = head;
    }

    display(head);

    return 1;
}

void display(NODE *head) {

    NODE *temp = NULL;
    temp = head;

    printf("Elements --> ");
    do {
            printf("%d ", temp->data);
            temp = temp->next;
    } while (temp != head);

    printf("\n");

}
4

3 に答える 3

7

head明示的に初期化lastする必要がありNULLます。

あなたの宣言では:

NODE *head, *last, *newnode = NULL;

newnodeに初期化されているだけNULLです。したがって、後でif / elseで、ランダムメモリにテスト/割り当てます。

このようなことをします:

NODE *head, *last, *newnode;
head = last = newnode = NULL;

特定のシステムの場合でも、ポインタが自動的にに初期化されるとは限りません。として宣言された変数は例外です。Cの変数、特にポインターは常に適切な値に初期化してください。NULLstatic

ガベージメモリにアクセスすると、未定義の動作が呼び出されます。これを行うと、一貫性のない紛らわしい結果が見られる場合があります。あなたの場合、追加することで問題が解決したprintf ようです。これがコードの動作に影響を与えた理由は、実装に依存し、未定義の動作を導入すると、制御できなくなります。

于 2012-07-08T18:59:29.923 に答える
3

lasthead初期化されていません。あなたはあなたを助けるコンパイラ警告をオンにすることができます:

$ gcc -O1 -Wall w.c -o we
w.c: In function ‘main’:
w.c:30:23: warning: ‘last’ may be used uninitialized in this function [-Wuninitialized]
w.c:26:12: warning: ‘head’ may be used uninitialized in this function [-Wuninitialized]

(gccが機能する必要があることに注意してください-O1-Wuninitialized

于 2012-07-08T19:00:56.900 に答える
2

あなたは初期化していないhead、そしてlast

NODE *head, *last, *newnode = NULL;

そのため、割り当てられた場所にガベージビットがあり、適切に設定されていなくif (head == NULL)ても失敗する可能性があります。headそれらも初期化しNULLます。

于 2012-07-08T18:59:51.380 に答える