我在结构的末尾看到了这个语句在驱动程序中的用法。 任何人都可以解释我有什么使用这种说法吗?它如何在内部工作? 我的意思是编译器会认为它是数组或变量?int a [0];这个声明有什么用?它在哪里有道理?
1
A
回答
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
。
相关问题
- 1. A没有限制哪里声明
- 2. 这里有一个声明
- 3. 这两个声明有什么区别?
- 4. 这个方法在哪里声明?
- 5. 为什么这个函数声明两次?回调函数在哪里声明?
- 6. 这种声明有什么用处?
- 7. 这个AngularForEach声明有什么问题?
- 8. 这个声明`int fun-name(static int)`在C++中有效,为什么?
- 9. 这两个声明有什么区别?
- 10. 这两个声明有什么区别?
- 11. 这个IF声明有什么问题
- 12. 这个块声明有什么问题?
- 13. 这两个声明有什么区别?
- 14. 这两个声明有什么区别?
- 15. 这两个声明有什么区别?
- 16. 为什么GCC声明INT后consistenly没有打印0
- 17. 如何知道这个函数定义在哪里声明?
- 18. 这个声明有什么问题,为什么它不适用于FF?
- 19. 什么概念在这里工作,它在哪里应用?
- 20. 为什么我需要声明这个函数extern。它没有它的作品
- 21. int *在这里是什么?
- 22. drupal -----这些变量在哪里声明?
- 23. 在struct中这个`data [0]`声明的目的是什么?
- 24. “int * a = new int”和“int * a = new int()”有什么区别?
- 25. swap(int&a,int&b)和swap(int * a,int * b)。有什么区别?
- 26. 这两个char声明有什么区别?哪一个是正确的?
- 27. 如何解释(const int&a)和新的int(a),它有什么作用?
- 28. 这些#import声明有什么区别?
- 29. 这两个声明在c中有什么区别?
- 30. 使用“declare -a”在bash中声明数组有什么优势?
我想这是结构黑客。 [阅读本文](http://stackoverflow.com/q/3711233/2549281) – Dabo
这就是[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