为了账号安全,请及时绑定邮箱和手机立即绑定

在C练习中使用灵活的阵列成员?

在C练习中使用灵活的阵列成员?

C
白猪掌柜的 2019-07-30 11:21:11
在C练习中使用灵活的阵列成员?我最近读到在C中使用灵活的阵列成员是糟糕的软件工程实践。但是,该声明没有任何论据支持。这是公认的事实吗?(灵活的数组成员是C99中引入的C特性,其中可以将最后一个元素声明为未指定大小的数组。例如:)struct header {     size_t len;     unsigned char data[];};
查看完整描述

3 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

使用goto的软件工程实践很差,这是一个公认的“事实”。这并不是真的。有时goto很有用,特别是在处理清理和从汇编程序移植时。

灵活的阵列成员让我觉得有一个主要用途,在我的头顶,这是在RiscOS上映射遗留数据格式,如窗口模板格式。在大约15年前,它们对于这一点非常有用,而且我确信仍有人在那里处理那些会发现它们有用的东西。

如果使用灵活的阵列成员是不好的做法,那么我建议我们都告诉作者C99规范这个。我怀疑他们可能有不同的答案。


查看完整回答
反对 回复 2019-07-30
?
慕后森

TA贡献1802条经验 获得超5个赞

请仔细阅读以下评论中的评论

随着C标准化的推进,没有理由再使用[1]了。

我不赞成的原因是,为了使用这个功能,将代码绑定到C99是不值得的。

关键是你总是可以使用以下习语:

struct header {
  size_t len;
  unsigned char data[1];};

这是完全便携的。然后,在为数组中的n个元素分配内存时,可以考虑1 data

ptr = malloc(sizeof(struct header) + (n-1));

如果由于任何其他原因已经将C99作为构建代码的要求,或者您的目标是特定的编译器,我认为没有坏处。


查看完整回答
反对 回复 2019-07-30
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

你的意思是...

struct header{
 size_t len;
 unsigned char data[];};

在C中,这是一个常见的习语。我想很多编译器也接受:

  unsigned char data[0];

是的,这很危险,但是再一次,它确实没有比普通C阵列更危险 - 即非常危险;-)。小心使用它,并且仅在您真正需要未知大小的数组的情况下使用它。确保你使用malloc并使用以下内容正确释放内存: -

  foo = malloc(sizeof(header) + N * sizeof(data[0]));
  foo->len = N;

另一种方法是使数据只是指向元素的指针。然后,您可以根据需要将数据realloc()重新设置为正确的大小。

  struct header
    {
     size_t len;
     unsigned char *data;
    };

当然,如果你问的是C ++,那么这些都是不好的做法。然后你通常使用STL向量。


查看完整回答
反对 回复 2019-07-30
  • 3 回答
  • 0 关注
  • 474 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信