猿问

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

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

我最近读到在C中使用灵活的阵列成员是糟糕的软件工程实践。但是,该声明没有任何论据支持。这是公认的事实吗?

灵活的数组成员是C99中引入的C特性,其中可以将最后一个元素声明为未指定大小的数组。例如:)

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


白猪掌柜的
浏览 475回答 3
3回答

明月笑刀无情

使用goto的软件工程实践很差,这是一个公认的“事实”。这并不是真的。有时goto很有用,特别是在处理清理和从汇编程序移植时。灵活的阵列成员让我觉得有一个主要用途,在我的头顶,这是在RiscOS上映射遗留数据格式,如窗口模板格式。在大约15年前,它们对于这一点非常有用,而且我确信仍有人在那里处理那些会发现它们有用的东西。如果使用灵活的阵列成员是不好的做法,那么我建议我们都告诉作者C99规范这个。我怀疑他们可能有不同的答案。

慕后森

请仔细阅读以下评论中的评论随着C标准化的推进,没有理由再使用[1]了。我不赞成的原因是,为了使用这个功能,将代码绑定到C99是不值得的。关键是你总是可以使用以下习语:struct header {   size_t len;   unsigned char data[1];};这是完全便携的。然后,在为数组中的n个元素分配内存时,可以考虑1 data:ptr = malloc(sizeof(struct header) + (n-1));如果由于任何其他原因已经将C99作为构建代码的要求,或者您的目标是特定的编译器,我认为没有坏处。

慕桂英546537

你的意思是...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向量。
随时随地看视频慕课网APP
我要回答