在C练习中使用灵活的阵列成员?我最近读到在C中使用灵活的阵列成员是糟糕的软件工程实践。但是,该声明没有任何论据支持。这是公认的事实吗?(灵活的数组成员是C99中引入的C特性,其中可以将最后一个元素声明为未指定大小的数组。例如:)struct header {
size_t len;
unsigned char data[];};
3 回答
明月笑刀无情
TA贡献1828条经验 获得超4个赞
使用goto的软件工程实践很差,这是一个公认的“事实”。这并不是真的。有时goto很有用,特别是在处理清理和从汇编程序移植时。
灵活的阵列成员让我觉得有一个主要用途,在我的头顶,这是在RiscOS上映射遗留数据格式,如窗口模板格式。在大约15年前,它们对于这一点非常有用,而且我确信仍有人在那里处理那些会发现它们有用的东西。
如果使用灵活的阵列成员是不好的做法,那么我建议我们都告诉作者C99规范这个。我怀疑他们可能有不同的答案。
慕后森
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作为构建代码的要求,或者您的目标是特定的编译器,我认为没有坏处。
慕桂英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向量。
- 3 回答
- 0 关注
- 474 浏览
添加回答
举报
0/150
提交
取消