申し訳ありませんが、コードで質問をサポートできません (ここで受け入れられるように構造化する方法がわかりませんでした) が、とにかく試みます。
私が正しく理解していれば、同じ型の構造体を参照する構造体は、参照用のポインタを含めてこれを行う必要があります。このポインターは、セグメンテーション違反を発生させずに (ヒープではなく) スタック上の割り当てられたスペースを参照できますか? -
これはどのように宣言する必要がありますか?
あなたが作業している言語を言わなかったので、質問の文言から今のところCを想定しています...次のコードは完全に有効です:
typedef struct str_t_tag {
int foo;
int bar;
struct str_t_tag *pNext;
} str_t;
str_t str1;
str_t str2;
str1.pNext = &str2;
この例では、str1 と str2 の両方がスタックにありますが、どちらかまたは両方がヒープにある場合にも機能します。注意が必要な唯一のことは、スタック変数がスコープ外に出るとザッピングされることです。そのため、動的に str1 を割り当ててそれを関数の外に渡した場合、str1->pNext が指すのを望まないでしょう。その関数内のスタックにあったもの。
言い換えれば、これをしないでください:
typedef struct str_t_tag {
int foo;
int bar;
struct str_t_tag *pNext;
} str_t;
str_t *func(void)
{
str_t *pStr1 = malloc(sizeof(*pStr1));
str_t str2;
pStr1->pNext = &str2;
return pStr1; /* NO!! pStr1->pNext will point to invalid memory after this */
}
はい、スタック上の変数へのポインターを使用できますが、そのスタック フレームを提供するメソッドが返されていない場合に限ります。たとえば、これは機能します:
typedef struct
{
int a;
float b;
} s;
void printStruct(const s *s)
{
printf("a=%d, b=%f\n", s->a, s->b);
}
void test()
{
s s;
s.a = 12;
s.b = 34.5f;
printStruct(&s);
}
ただし、スタック フレームが消えてしまうため、これによりエラーが発生します。
s *bad()
{
s s;
s.a = 12;
s.b = 34.5f;
return &s;
}
編集:まあ、エラーが発生すると言いますが、そのコードを次のように呼び出している間:
int main()
{
test();
s *s = bad();
printStruct(s);
return 0;
}
コンパイル中に次の警告が表示されます。
s.c:27:5: warning: function returns address of local variable [enabled by default]
プログラムは正常に動作しているように見えます:
$ ./s
a=12, b=34.500000
a=12, b=34.500000
しかし、実際には壊れています。
これが特に C/C++ に関する質問かどうかはわかりませんが、例として C/C++ コードを示します。
あなたがそれを宣言できる唯一の方法:(マイナーなバリエーションで)
typedef struct abc
{
struct abc *other;
} abc;
other
次のように、スタック上のオブジェクトを指すことができます。
abc a, b; // stack objects
b.other = &a;
これはスコープに関する質問ではないので、上記の実行で起こりうる問題についてのコメントはスキップします。
ただし、動的に作成されたオブジェクトに割り当てたい場合、このオブジェクトをスタックに置く方法はありません。
abc b;
b.other = malloc(sizeof(abc)); // on the heap