[英]How to write after the end of the already initialized struct?
我在堆棧上初始化了一個結構,我想在結構之后立即在 memory 中寫入數據,並使結構內的指針指向該數據。 我知道使用 malloc(sizeof(struct) + additional size) 或 alloca() 在未初始化結構的堆棧/堆上是可以實現的。 但是我可以在結構已經在堆棧上初始化之后執行數據的初始化嗎? 我可以在初始化器 function 中執行此初始化嗎?
簡單的例子:
struct TEST {
wchar_t* itest;
};
void init_struct(struct TEST* test) {
// point to the end of the struct
char* walk_ptr = (char*)test + sizeof(test);
test->itest = (wchar_t*)walk_ptr;
// initialize data after the struct
...
}
int main(void) {
struct TEST test;
init_struct(&test);
return 0;
}
您可以通過將結構嵌入到另一個結構中來為額外數據保留 memory 來做到這一點:
int main(void)
{
struct { struct TEST test; wchar_t data[NumberOfElements]; } S;
init_struct(&S.test);
…
}
但是, init_struct
中的代碼向指針添加了不正確的大小sizeof(test)
。 您可能想添加sizeof (struct Test)
,或者等效地添加sizeof *test
,因為您想通過test
指向的struct TEST
,而不是通過test
所在的struct TEST *
。
但是,即使添加結構的正確大小也不能保證嚴格符合 C 代碼,因為 C 實現可能會在結構成員之間插入填充。 適當地,我們將添加data
成員的偏移量。 為此,我們需要給結構一個標簽,然后要么使結構定義對init_struct
可見,要么將偏移量傳遞給init_struct
。 但是,只傳遞額外數據的地址更容易:
void init_struct(struct TEST *test, wchar_t *data)
{
test->itest = data;
}
int main(void)
{
struct { struct TEST test; wchar_t data[NumberOfElements]; } S;
init_struct(&S.test, S.data);
…
}
當然,指針可以指向任何地方,沒有明顯的理由數據應該緊跟在結構之后,所以我們可以斷開它們:
int main(void)
{
struct TEST test;
wchar_t data[NumberOfElements];
init_struct(&test, data);
…
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.