2017-02-10 11 views
7

私はC++でこの質問への回答の多くを発見したが、私はC.C相当(起動時に一回実行します)

で厳密に興味を持って、私はCで、円形のリンクリストを持っている、と私それが最初にアクセスされる前にダミーヘッダーノードで初期化したいとします。ダミーヘッダーノードは、静的に割り当てられたグローバル変数です。これは私の現在の解決策です:

static once = 1; 
if(once){ 
    once = 0; 
    // Setup code 
} 

これは動作しますが、このリンクされたリストを使用するすべての関数に入れなければなりません。 (もちろん、私はこのコードを独自の関数に入れることができるので、他のすべての関数でその関数を呼び出す必要がありますが、それほど優れているわけではありません)もっと良い方法はありますか?私は、次の構造体を持っている場合たとえば、:

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

は、それ自体へのnext値のポイントとなるようリテラルとしてこれらの構造体のいずれかを、初期化する方法はありますか? 「リテラルとして初期化」により、

、私はこの意味:(私はおそらく間違った用語ですみません)

struct test { 
    int i; 
    double d; 
}; 

struct test magic = {1, 2.3}; // This can just be done at the top of the c file, outside of any functions 

int someFunction(){...} 
+0

:あなたが何かを行うには、同じ目的を達成する前にmain()でスタートアップ」コードでNCE。あなたの例のコードは上手く見えます。どうしたの? – 5gon12eder

答えて

5

それは、ファイルの場合は、ちょうど、あなたが言う正確に何をすべきか、そしてそれ自体を指すことができますが-scope変数:出力と

#include <stdio.h> 

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

struct node mylist = { 1, &mylist }; 

int main(void) 
{ 
    printf("%d %d\n", mylist.value, mylist.next->value); 
    return 0; 
} 

[email protected]:~/src/sandbox$ ./list 
1 1 
pau[email protected]:~/src/sandbox$ 

また、当然のことながら、「実行Oを追加することができます私はあなたが何をしようとして取得しない怖い

#include <stdio.h> 
#include <stdlib.h> 

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

struct node * mylist; 

int main(void) 
{ 
    mylist = malloc(sizeof *mylist); 
    if (!mylist) { 
     perror("couldn't allocate memory"); 
     return EXIT_FAILURE; 
    } 

    mylist->value = 1; 
    mylist->next = mylist; 

    /* Rest of your program here */ 

    return 0; 
} 
+0

後で見ると、これは本当に明白であったはずです。私は同じ表現で代入されている変数を参照できるかどうか分からなかったと思います。ありがとう! – ItsTimaiFool

関連する問題