c - C语言中的结构体

标签 c linux pointers struct syntax

当我研究设备驱动程序时,我遇到了下面的代码。

static struct char_device_struct{
    struct char_device_struct *next;
    ...
} *chrdevs[CHRDEV_MAJOR_HASH_SIZE];

我认为它可能是定义结构体数组,所以我写了一个像下面这样的简单代码,发现了奇怪的事情。

struct a{
    int _a;
} val_a[10];

struct b{
    int _b;
};

struct b val_b;

int main(){
    val_a->_a=10;
    val_b._b=10;

    return 0;
}

val_a 可以通过“->”访问,就像堆或 mmap 中分配的内存(通过指针访问)一样,但不能像“.”那样访问。

  • 使用类似数组的结构意味着什么(例如 CHRDEV_MAJOR_HASH_SIZE)
  • 如果它只是定义结构数组,那么与仅使用 val_b 有何区别。

抱歉英语不好。 非常感谢。

最佳答案

I thought it could be defining struct array,

不,它不是由结构组成的数组,而是保存指向结构的指针的数组。该代码定义了一个包含 CHRDEV_MAJOR_HASH_SIZE 指针的数组,没有任何结构体本身的内存。

在您的代码中,这将是

struct a{
    int _a;
} *val_a[10];

然后你可以像这样使用它:

val_a[0] = malloc(sizeof(struct a));
val_a[0]->_a = 123;
(*val_a[0])._a = 123; // identical to previous line.

或者,如果您想使用该数组中的衰减指针:

*val_a = malloc(sizeof(struct a));
(*val_a)->_a = 123;

但这只会访问数组的第一个元素。

关于c - C语言中的结构体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48182596/

相关文章:

c++ - 在 C/C++ 中按位指定浮点常量值

c - 通过 C 中的 tokenise 函数从 malloc 泄漏内存

linux - linux不能用分号设置环境变量

linux - 查找包含文本但不包含第二个文本的文件

c++ - 关于从结构指针读取的代码的简单代码

c - 带 struct 关键字的 Visual Studio 2008 Intellisense

c - 手册页版本与 Linux 内核和 libc 版本有何关系?

c - 基本的 C 指针分配/释放

c - 取消引用数组名称

java - c - .class 的等价物