栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C语言】关于结构体初始化赋值

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C语言】关于结构体初始化赋值

在GUN C中,支持通过标号元素来对指定结构体成员名进行初始化,这允许初始化值以任意顺序出现。
在Linux内核中对init_mm初始化时有如下代码。

#define INIT_MM_CONTEXT(name)	
	.pgd = init_pg_dir,

struct mm_struct init_mm = {
	.mm_rb		= RB_ROOT,
	.pgd		= swapper_pg_dir,
	.mm_users	= ATOMIC_INIT(2),
	.mm_count	= ATOMIC_INIT(1),
	.write_protect_seq = SEQCNT_ZERO(init_mm.write_protect_seq),
	MMAP_LOCK_INITIALIZER(init_mm)
	.page_table_lock =  __SPIN_LOCK_UNLOCKED(init_mm.page_table_lock),
	.arg_lock	=  __SPIN_LOCK_UNLOCKED(init_mm.arg_lock),
	.mmlist		= LIST_HEAD_INIT(init_mm.mmlist),
	.user_ns	= &init_user_ns,
	.cpu_bitmap	= CPU_BITS_NONE,
	INIT_MM_CONTEXT(init_mm)
};

其中对.pgd进行了两次赋值,第一次是.pgd = swapper_pg_dir,,而最后,又使用INIT_MM_CONTEXT宏对其进行了赋值,那结果如何呢?
请看如下测试代码:

#include 

#define __pr(x)     printf("%-40s: %dn", #x, x)

struct test {
    int a;
    int b;
    int c;
};

int main(void)
{
    struct test val = {
        .a = 1,
        .c = 2,
        .a = 3, // final val
    };

    __pr(val.a);
    __pr(val.b);
    __pr(val.c);

    return 0;
}

测试结果

val.a                                   : 3
val.b                                   : 0
val.c                                   : 2

从测试结果来看,最终结果以最后一次赋值为准。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/913271.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号