簡體   English   中英

在已經初始化的結構體結束后如何寫?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM