c - 使用结构 struct { a[0] } 测试;

标签 c linux-kernel

我猜不出像

这样的结构的使用
struct 
{
    uint64_t offsets[0];
} table; 

请给我一些关于这方面的提示。

最佳答案

您发布的代码正式无效。形式上,C 语言不支持大小为 0 的数组。

一些编译器(带有松散/遗留错误检查)允许在结构末尾使用大小为零的数组,这有时用于实现所谓的 "struct hack"。 . (更好的方法是使用大小为 1 的尾随数组。)但是您的声明未提供该用途。 “Struct hack”需要一个命名的结构类型,并且必须动态分配实际对象。在您的情况下,结构类型未命名,并且变量 table 是非动态定义的。因此,假设您正确地重现了代码,“struct hack”在这里是毫无疑问的。

因此,即使它编译了,您最终得到的变量 table 不包含任何可用数据。此变量的唯一用途(如果声明为静态存储持续时间)是通过 &table 表达式(“指向匿名结构的指针”类型的指针)生成唯一的地址常量。

将您的声明变成更接近“struct hack”的一种方法是在它前面添加一个typedef

typedef struct 
{
  uint64_t offsets[0];
} table; 

但是,“struct hack”的“人工生成”结构声明通常会在灵活的数组声明之前包含其他数据字段(没有它们,选择“struct hack”而不是普通数组就毫无意义)。

关于c - 使用结构 struct { a[0] } 测试;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14028359/

相关文章:

c - 了解 map 文件,优化大小

linux - 构建 Linux Kernel 4.18 时出现编译时错误

c - 在内核模块中访问串口

linux - 为 Raspberry Pi 定制内核

c - 如何从c中的字符串中分离整数和运算符?

c - 这个三元运算符的结果是什么?

c - SDL 'no available video device' 错误且未检测到 x11

c - MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED

java - 从 LKM/kernel-space 启动 Android Activity

linux - 使用 perf probe 监控特定功能期间的性能统计信息