[英]Another way of implementing zero-length arrays?
我在讀零長度數組 ,在哪里以及如何使用它以及全部。 而且我了解到,當人們想要一個結構中具有動態大小的成員時,就會使用它們。 它與使用指針不同,因為
根據這個答案 。
事實1
malloc
的參數復雜化。 事實2
現在我真的不知道擴展在這里意味着什么。 但是我在想的是事實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.