打印
[C语言]

结构体嵌套

[复制链接]
1569|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yanghelovehuang|  楼主 | 2018-8-9 17:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yanghelovehuang 于 2018-8-10 09:38 编辑

问了你们这么多结构体问题正在练习结构体,可是遇到一个问题不明白,在编写应用程序时这种嵌套是非法的:
struct st{
     struct mn lk;
};
可是为什么内核就可以呢?而且内核里很多结构体都是这样嵌套的。
内核:
struct atmel_nand_host {
        struct nand_chip        nand_chip;
        void __iomem                *io_base;
        dma_addr_t                io_phys;
        struct atmel_nand_data        board;
        struct device                *dev;
        void __iomem                *ecc;

        struct completion        comp;
        struct dma_chan                *dma_chan;

        struct atmel_nfc        *nfc;

};
他们是怎么做的?还有:static int atmel_nand_probe(struct platform_device *pdev){
        struct atmel_nand_host *host;
        struct mtd_info *mtd;
        struct nand_chip *nand_chip;
        struct resource *mem;
        int res, irq;

        /* Allocate memory for the device structure (and zero it) */
        host = devm_kzalloc(&pdev->dev, sizeof(*host), GFP_KERNEL);
        if (!host)
                return -ENOMEM;

        res = platform_driver_register(&atmel_nand_nfc_driver);
        if (res)
                dev_err(&pdev->dev, "atmel_nand: can't register NFC driver\n");

        mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        host->io_base = devm_ioremap_resource(&pdev->dev, mem);
        if (IS_ERR(host->io_base)) {
                res = PTR_ERR(host->io_base);
                goto err_nand_ioremap;
        }
        host->io_phys = (dma_addr_t)mem->start;

        nand_chip = &host->nand_chip;
        mtd = nand_to_mtd(nand_chip);
        host->dev = &pdev->dev;

我们使用结构体时如果函数内声明结构体指针变量,如果不给该变量分配空间的话就会出现段错误,可是在内核里,像这段代码,除了host指针变量被分配空间其他的都没分配空间,可是直接赋值也没报错,这是为什么啊?


相关帖子

沙发
xuplastic| | 2018-8-9 20:16 | 只看该作者
目测你想写的是:

struct st{
     struct st lk;
};

递归嵌套肯定是不允许的,要不然无限循环了··········

使用特权

评论回复
板凳
Vansm| | 2018-8-9 21:15 | 只看该作者
首先告诉你结构体嵌套是完全允许的  如二楼所说 不允许嵌套自己本身  但是允许嵌套自己本身类型的结构体指针  另外被嵌套的结构体要在之前声明  不然编译的时候找不到

使用特权

评论回复
地板
yanghelovehuang|  楼主 | 2018-8-10 09:13 | 只看该作者
xuplastic 发表于 2018-8-9 20:16
目测你想写的是:

struct st{

这个我知道,我只是想知道内核里他们是怎么做,可以这样写。

使用特权

评论回复
5
yanghelovehuang|  楼主 | 2018-8-10 09:14 | 只看该作者
Vansm 发表于 2018-8-9 21:15
首先告诉你结构体嵌套是完全允许的  如二楼所说 不允许嵌套自己本身  但是允许嵌套自己本身类型的结构体指 ...

这个我知道,我只是想知道内核里他们是怎么做,可以这样写。重点在内核的实现

使用特权

评论回复
6
Vansm| | 2018-8-10 09:16 | 只看该作者
yanghelovehuang 发表于 2018-8-10 09:14
这个我知道,我只是想知道内核里他们是怎么做,可以这样写。重点在内核的实现 ...

你发的那段内核程序本身语法就是合法的啊  你自己那个估计是没先定义被嵌套的结构体

使用特权

评论回复
7
yanghelovehuang|  楼主 | 2018-8-10 09:27 | 只看该作者
Vansm 发表于 2018-8-9 21:15
首先告诉你结构体嵌套是完全允许的  如二楼所说 不允许嵌套自己本身  但是允许嵌套自己本身类型的结构体指 ...

我试过了 如果被嵌套的结构体放在前面声明,就还可以这样嵌套,
struct mn {
        int c;
};

struct st {
        int a;
        struct mn lk;
};
我想内核也应该是这么做的,谢谢啊。

使用特权

评论回复
8
linqing171| | 2018-8-12 22:17 | 只看该作者
struct mn ;

struct st {
        int a;
        struct mn lk;
};

struct mn {
        int c;
};

放后面看看行不行。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

156

主题

324

帖子

1

粉丝