以下是什么意思?
struct foo
{
...
char bar[0]; // Zero size???
};
Run Code Online (Sandbox Code Playgroud)
我问我的同事,他们告诉我这和写作一样void* bar.
据我所知,C指针只是一个4字节的变量(至少在32位机器上).编译器如何知道bar [0]是一个指针(因而长4个字节)?这只是语法糖吗?
你的同事撒了谎.(可能不是故意的,但不要对他们或任何事情生气.)
这被称为灵活的数组成员,并且在C99中被编写为char bar[];,并且在C89中被编写为char bar[1];,并且一些编译器将允许您编写为char bar[0];.基本上,您只使用指向结构的指针,并在结尾处分配额外的空间:
const size_t i = sizeof("Hello, world!");
struct foo *p = malloc(offsetof(struct foo, bar) + i);
memcpy(p->bar, "Hello, world!", i);
// initialize other members of p
printf("%s\n", p->bar);
Run Code Online (Sandbox Code Playgroud)
这样,p->bar存储一个字符串,其大小不受数组声明的限制,但仍然在与其余部分相同的分配中完成struct(而不是需要成员为a char *并需要两个mallocs和两个frees来设置它).
| 归档时间: |
|
| 查看次数: |
232 次 |
| 最近记录: |