對不起,我不能支持我的問題與一些代碼(我不知道如何構造它,因此它會被接受在這裏),但我仍然嘗試。指向堆棧
如果我理解正確,那麼引用相同類型結構的結構將需要使用包含的指針進行引用。這個指針可以引用堆棧上的分配空間(而不是堆)而不會產生分段錯誤? -
這應該如何聲明?
對不起,我不能支持我的問題與一些代碼(我不知道如何構造它,因此它會被接受在這裏),但我仍然嘗試。指向堆棧
如果我理解正確,那麼引用相同類型結構的結構將需要使用包含的指針進行引用。這個指針可以引用堆棧上的分配空間(而不是堆)而不會產生分段錯誤? -
這應該如何聲明?
是的,你可以使用堆棧指針上的變量,但只有當還沒有恢復提供該堆棧幀的方法。例如,這將工作:
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
但是,事實上,破碎。
你沒有說什麼語言你的工作中,所以假設下,現在從你的問題的措辭...下面的代碼是完全合法:
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 */
}
不知道這是否是特別的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
當你聲明時,你不需要做任何特殊的事情。指針是否指向堆棧,堆或NULL對包含它的結構的聲明沒有影響。 –