C:动态大小结构的推荐样式

cod*_*nix 9 c struct data-structures

我需要通过互联网传输数据包,其长度应该是动态的.

struct packet
{
  int id;
  int filename_len;
  char filename[];
};
Run Code Online (Sandbox Code Playgroud)

问题是零长度数组不符合ISO标准.

我应该用char filename[1];吗?但是sizeof(struct packet)不会再返回正确的值了.

Jar*_*Par 6

我认为你应该看看动态大小结构的一些现有例子,以获得指导.我所知道的最好的例子是Win32中的TOKEN API.他们使用宏ANYSIZE_ARRAY,它只能解析为1.Raymond Chen做了一篇广泛的博客文章,详细说明了他们为什么这样做

至于诸如sizeof失败的操作.无论您为动态大小的结构选择何种解决方案,这都将失败.sizeof是一个编译时操作,您将在运行时重新调整结构大小.它根本无法工作.


jes*_*sup 6

经典问题.您可以简单地处理它(并注意,如果编译器将结构大小向上舍入(我相信)允许的话,sizeof(foo)可能会超过一个),或者您可以执行以下操作:

struct packetheader {
   int id;
   int filename_len;
};
struct packet {
   struct packetheader h;
   char filename[1];
};
Run Code Online (Sandbox Code Playgroud)

这很烦人(你必须使用h.id等),但它确实有效.通常我只是处理它是一个,但上面可能稍微更便携.