2017-01-28 8 views
-1

別の関数のスコープ内のポインタのリストに新しい要素を作成して挿入することは可能ですか?私は、ポインタを使用している場合、私が作成して挿入することができると思ったこのコードだけで私はローカル変数n2_4を作成しましたprintfinsertEntry内の関数を呼び出す場合はそうでない場合、出力はvoidの関数とスコープのローカル変数

-1247318248で働くセグメンテーションフォールト

どこでもポインタのリストの新しい要素が必要です。しかし、それはローカル変数の制限された可視性スコープのようなものです。または私は間違っている?

または、このような目的のためにポインタのポインタを返すことができる関数を使用する必要がありますか?

// Function to insert a new entry into a linked list. 
#include <stdio.h> 

struct entry 
{ 
    int   value; 
    struct entry *next; 
}; 

void insertEntry(struct entry *insertion, struct entry *previous) 
{ 
    struct entry n2_4; 
    n2_4.value = 299; 
    struct entry *N2_4 = &n2_4; 

    insertion->next = previous->next; // set n2_3.next to point to whatever n2.next was pointing to 
    previous->next = insertion;  // set n2.next to point to n2_3 

    insertion->value = 250; 

    N2_4->next = insertion->next; 
    insertion->next = N2_4; 
} 

void printPlist(struct entry *list_pointer) 
{ 
    while (list_pointer != (struct entry *) 0) { 
     printf("%i\n", list_pointer->value); 
     list_pointer = list_pointer->next; 
    } 
    printf("\n"); 
} 

int main(void) 
{ 


    struct entry n1, n2, n3, n2_3; 
    struct entry *list_pointer = &n1; 

    n1.value = 100; 
    n1.next = &n2; 

    n2.value = 200; 
    n2.next = &n3; 

    n3.value = 300; 
    n3.next = (struct entry *) 0; // Mark list end with null pointer 

    printPlist(list_pointer); 

    insertEntry(&n2_3, &n2); 

    printPlist(list_pointer); 

    return 0; 
} 
+2

いいえ、関数外の(非静的な)ローカル変数は使用できません。彼らは範囲外に出ます。 – kaylum

+0

ありがとう@ kaylum! – Yellowfun

答えて

2

あなたが探しているのは、動的メモリ割り当てです。mallocをご覧ください。

基本的にローカル変数は、関数から戻るときに「消えます」。 freeを明示的に呼び出すまで、動的に割り当てられたメモリが有効になります。

これは役に立ちました:幸運を助けてくれました:)

+0

ありがとうございます!私はポインタについて読んだだけで、まだ動的メモリ割り当てには達していません。 – Yellowfun

関連する問題