当我查看Linux内核代码时,发现以下代码:
struct thread_info {
struct task_struct *task;
struct exec_domain *exec_domain;
unsigned long flags;
__u32 status;
__u32 cpu;
int preempt_count;
mm_segment_t addr_limit;
struct restart_block restart_block;
void __user *sysenter_return;
unsigned long previous_esp;
__u8 supervisor_stack[0];
};
请注意,最后一个变量“ supervisor_stack”是零长度的数组,它的用途是什么?提前致谢!
它是GCC提供的扩展的灵活阵列成员的C99之前版本。
C99的方法是用空括号定义柔性数组成员,
__u8 supervisor_stack[];
它用于存储数量不恒定的连续数据。内存以以下形式分配
struct foo *ptr = malloc(sizeof *ptr + whatever_is_needed);
在6.7.2.1的第18段中,标准(草案N1570)描述了它们:
作为一种特殊情况,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型;这称为灵活数组成员。在大多数情况下,柔性数组成员将被忽略。特别地,该结构的尺寸就好像省略了柔性阵列构件,除了其可能具有比省略所暗示的更多的尾随填充。然而,当一个
.
(或->
)运算符的左操作数是一个指向具有灵活数组成员的结构的指针(指向该成员),右操作数为该成员命名,它的行为就好像该成员被最长数组(具有相同元素类型)所取代,而该数组不会使结构大于要访问的对象;即使该阵列的偏移量与替换阵列的偏移量不同,其偏移量也应保持为柔性阵列成员的偏移量。如果此数组不包含任何元素,则其行为就好像它具有一个元素一样,但是如果尝试访问该元素或生成一个指针经过该元素,则该行为未定义。
问题内容: 例如,我们可以像这样构造一个数组: 我看到了这样的构造,但是我不明白为什么这可能有用。 问题答案: 一个例子。说,你有一个功能 获取一些文件名。想象一下,您找不到满足条件的文件名。你还回来什么?您有2个选择- 返回null 或 0大小的array 。 大小 为 0的数组 的变体更好,因为您的调用方不需要检查 NULL, 并且可以以一致的方式处理该数组-例如,在循环中(在这种情况下为空)
在Go语言规范中,提到了对标签的简要概述: 字段声明之后可能会有一个可选的字符串文字标记,该标记将成为相应字段声明中所有字段的属性。标记通过反射界面可见,但在其他情况下被忽略。 这是一个非常简短的解释,我想知道是否有人能给我提供这些标签的用途?
问题内容: 我是Java的初学者,我想以一种简单的方式知道为什么您应该使用参数化构造函数而不是编译器提供的默认构造函数。 谢谢 问题答案: 默认构造函数将您的对象可能具有的所有属性设置为0,false等。如果要立即设置属性,则可以使用参数化的构造函数。当然,也可以使用您自己的构造函数为您提供在创建对象之前(技术上而言)执行代码的选项。 顺便说一句:“默认值不会为属性设置任何值”的答案是错误的。例如
前面学习 数据结构的过程中,总是使用数组作为 顺序表的底层实现,给我们一种 "数据结构中,数组的作用就是实现顺序表" 的错误认识。其实,数组的作用远不止于此。 本节将从数据结构的角度讲解 数组存储结构。 本节所讲的数组,要将其视为一种存储结构,与平时使用的数组基本数据类型区分开。 一说起数组,我们的印象中数组往往是某一门编程语言中包含的具体数据类型,其实不然。 从本质上讲,数组与顺序表、 链表、
问题内容: 有2个类的构造函数 按照用于第二构造的描述预言状态如 使用单个长种子创建一个新的随机数生成器。种子是通过方法next(int)维护的伪随机数生成器内部状态的初始值。 我不完全了解。而且我没有找到任何文章/书可以清楚地解释 为什么 , 何时 以及 如何使用 它。 有人可以解释一下吗? 问题答案: 伪随机数生成器通过根据先前生成的数字重复生成一个新数字来工作。这意味着,如果您始终具有相同的
本文向大家介绍PACT 在微服务架构中的用途是什么?相关面试题,主要包含被问及PACT 在微服务架构中的用途是什么?时的应答技巧和注意事项,需要的朋友参考一下 PACT 是一个开源工具,允许测试服务提供者和消费者之间的交互,与契约隔离,从而提高微服务集成的可靠性。 在微服务中的用法: 用于在微服务中实现消费者驱动的契约。 测试微服务的消费者和生产者之间的消费者驱动的契约。