2014-04-22 30 views
1

我在结构的末尾看到了这个语句在驱动程序中的用法。 任何人都可以解释我有什么使用这种说法吗?它如何在内部工作? 我的意思是编译器会认为它是数组或变量?int a [0];这个声明有什么用?它在哪里有道理?

+0

我想这是结构黑客。 [阅读本文](http://stackoverflow.com/q/3711233/2549281) – Dabo

+0

这就是[struct hack](http://stackoverflow.com/questions/16553542/c-struct-hack-at-work)。现在您可以使用[Flexible Array Members](http://stackoverflow.com/questions/246977/flexible-array-members-in-c-bad)。 – pmg

回答

0

虽然两个标准都不支持大小为0的数组,但许多编译器都允许它们作为扩展。标准化的C方式(C99 +)反而完全忽略了尺寸。

这是用来描述一个数据结构,包括起始字段和可变数量的数组元素,以及为了舒适地访问它们。

2

在C中,允许您在结构的末尾放置一个可变大小的数组,通过为固定大小的字段和数组中的任何内容分配足够的内存是一种技巧。例如:

struct array { 
    size_t size; 
    int a[]; // strictly, it should be incomplete rather than zero sized 
}; 

struct array * make_array(size_t size) { 
    struct array * array = malloc(sizeof (struct array) + size * sizeof (int)); 
    array->size = size; 
    return array; 
} 

struct array * array = make_array(2); 
array->a[1] = 42; // No problem: there's enough memory for two array elements 

在C++中,它是无效的。改为使用std::vector

相关问题