簡體   English   中英

實現零長度數組的另一種方法?

[英]Another way of implementing zero-length arrays?

我在讀零長度數組 ,在哪里以及如何使用它以及全部。 而且我了解到,當人們想要一個結構中具有動態大小的成員時,就會使用它們。 它與使用指針不同,因為

  • 它使您可以為結構分配內存,並為結構末尾的可變長度數組分配一個連續的內存塊。
  • 如果使用了指針,則要么必須分別分配內存(兩個malloc調用,可能是非連續的),要么使用其他技巧(以實現正確的對齊等)。

根據這個答案


現在,所有這些都很好。 直到我閱讀了有關此問題的更舊的事實。

事實1

  • 在ISO C90中,必須將內容的長度設為1,這意味着您浪費空間或使malloc的參數復雜化。

事實2

  • GCC允許將此功能作為擴展。

現在我真的不知道擴展在這里意味着什么。 但是我在想的是事實1 前面有更多解釋


讓我們看一些代碼。

 #include<stdio.h> #include<stdlib.h> struct line { int len; char* content; }; int main() { int i; struct line* p = malloc(sizeof(struct line) + 10); p->len = 10; p->content = (char*)(&(p->len) + 1); printf("%p\\n", &(p->len)); for(i = 0; i < 10; i++) { printf("%p\\n", &(p->content[i])); } } 

我想出的這段代碼有效地實現了零長度數組的所有功能。 可能會有一些額外的代碼,但是絕對比事實1的不利影響要好。

因此,我的問題是,是否有任何特殊原因為何不使用上述方法(在上面的代碼中演示),並且他們必須向GCC添加擴展名或使用大小為1的數組。

len > 0時,此方法不起作用。

它在content字段中保存2項內容,即數組的地址和數組的第一個元素。

重新編寫代碼以演示效果。

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

struct line
{
    int len;
    char* content;
};

int main()
{

    int i;
    size_t size = sizeof(struct line) + 10;
    struct line* p = malloc(sizeof(struct line) + 10);
    memset(p, 0, size);
    p->len = 10;
    p->content = (char*)(&(p->len) + 1);

    printf("%p\n", &(p->len));

    for(i = 0; i < 10; i++)
    {
        printf("%p %02hhX\n", (void*) &(p->content[i]), p->content[i]);
    }

}

產量

0x80028260
0x80028264 64  // content address takes up same space as char array
0x80028265 82
0x80028266 02
0x80028267 80
0x80028268 00
0x80028269 00
0x8002826a 00
0x8002826b 00
0x8002826c 00
0x8002826d 00

您聲明char content [1]而不是方法的原因是使結構直接可序列化和可反序列化 想一想,如果您通過網絡套接字或文件將line結構寫入文件以供其他應用程序讀取,將會發生什么情況。 line->content指針對於接收應用程序將完全無效。

如果將內容聲明為大小為1的數組,則不會出現上述問題。 但是,您確實必須稍微復雜化malloc調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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