1

これが私のコードです:

#include <stdio.h>

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

void push(node *top, int data) {
    node *new_node = (node*) malloc(sizeof(node));
    new_node->data = data;
    new_node->next = top;
    top = new_node;
}

int main() {
    node *top = (node*) malloc(sizeof(node));
    top->data = 1;
    printf("Set data of top node to: %d\n", top->data);

    push(top, 2);
    printf("Pushed 2 to top, top->next->data = %d\n", top->next->data);
}

プログラムは最後の 3 行目 ( push(top, 2);) でセグメンテーション違反を起こし、次の行にあると思います。top = new_node;

私はCを学んでいます(今はポインター)。

私は何を間違えましたか?

4

2 に答える 2

5

ここでの問題は、top要素へのポインターを値で渡し、関数内でポインターを設定しようとするが、それは単なるローカル変数であり、それへの変更は関数の外では見えないことです。

top代わりに、ポインターへのポインターを使用して、ポインターを参照渡しします。

void push(node **top, int data) {
    node *new_node = malloc(sizeof(node));
    new_node->data = data;
    new_node->next = *top;
    *top = new_node;
}

...

push(&top, 2);

別の方法は、代わりに関数から新しいトップを返すことです:

node *push(node *top, int data) {
    node *new_node = malloc(sizeof(node));
    new_node->data = data;
    new_node->next = top;
    return new_node;
}

...

top = push(top, 2);
于 2012-10-19T09:07:22.923 に答える
1

ポインタは に値渡しされますpush。したがって、 に行った変更は にtop反映されませんmain。変更する場合topは、ポインターのアドレスを渡します。

#include <stdio.h>

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

void push(node **top, int data) {
    node *new_node = (node*) malloc(sizeof(node));
    new_node->data = data;
    new_node->next = *top;
    *top = new_node;
}

int main() {
    node *top = (node*) malloc(sizeof(node));
    top->data = 1;
    printf("Set data of top node to: %d\n", top->data);

    push(&top, 2);
    printf("Pushed 2 to top, top->next->data = %d\n", top->next->data);
}

関連するC-FAQは次のとおりです。

于 2012-10-19T09:08:17.853 に答える