最近项目小组在去除代码中的warning,在修正代码的过程中看到了对结构体不正确的初始化方式:
假设有一个如下的struct定义:

struct astruct
{
    int a;
    int b;
};
struct astruct test = {0};

即使astruct中都是基础类型的成员这样的初始化话也是不正确的。
这种初始化仅仅是把a变量设置为了0,而未对b变量做初始化。
产生这样错误的原因,大概是收到数组初始化的影响。数组是可以这么初始化话的,而且初始化的值只能是0!
对结构体的初始化,可以有一下三种。

struct test
{
    int a;
    int b;
};
int main()
{
    struct test t1 = {0, 0}; 
    struct test t2 =
        .a=2
        .b=3
    };  
    struct test t3 =
        a:12345,
        b:567890
    };  
    printf(“t1.a = %d, t1.b = %d\n”, t1.a, t1.b);
    printf(“t2.a = %d, t2.b = %d\n”, t2.a, t2.b);
    printf(“t3.a = %d, t3.b = %d\n”, t3.a, t3.b);
    return 0;
}

第一种使我们最常见的方式,2,3中是gcc的扩展,非标准。

转载请注明出处.http://www.vimer.cn

有限状态机的C++实现(2)-bayonet开源网络服务器框架

接着上一篇文章: 有限状态机的C++实现(1)-epoll状态机,我们今天来介绍更复杂和深入的部分。 为什么会在标题中提到bayonet这个开源项目呢?笔者本人一直想要...

阅读全文

时间相关的一些前后台知识

最近有很多时间相关的一些技术积累,主要分为三块, 1.gettimeofday时间差不准的bug 2.时间的字符串形式和时间戳形式的转化(C语言) 3.提供时间日期选择的...

阅读全文

vim(gvim)一键执行python脚本的bug

前一段时间在博客中和fuadam讨论过python中调用print的时候,是否可以直接打印decode之后的字符的问题。(原文:python-django的中文编码总结) 一开始我...

阅读全文

9则回应给“结构体初始化的方法”

  1. 老戴说道:

    这种写法为什么只能用于初始化,不能用于赋值呢?

    [回复]

    Dante 回复:

    只能说是编译器的实现吧,就像你可以写
    char a[10]=”www”;
    却不能写
    a=”www”;
    一样的道理……

    [回复]

    Dante 回复:

    当然只是个人理解啦,不对还请指正~~

    [回复]

  2. baikaishiuc说道:

    第二种,第三种方式应该是C99所支持的,但是在微软的编译器中不支持C99,所以才会给人以只有GCC支持的错觉。

    第一种方式尽量少写。在生成汇编代码时,会消耗掉非常多的时钟周期。

    [回复]

    Dante 回复:

    呵呵,多谢指教~~~

    [回复]

  3. jameschen说道:

    我在gcc 4.1.2下测试下面其实也对b进行了初始化。觉得是否初始化,是编译器的行为。
    struct astruct
    {
    int a;
    int b;
    };
    struct astruct test = {0};

    [回复]

    Dante 回复:

    嗯,我在家里windows下的g++测试了一下,也是可以的,可能公司的版本比较低…

    [回复]

  4. Soros说道:

    结构体变量的初始化和数组的初始化几乎完全一样,不过方式二与方式三的初始化还真是第一次见到,学习了~

    [回复]

  5. allen303allen说道:

    举的例子太简单了,建议可以额外讲一下结构体中有union时的初始化方法,那个比较特殊,也很容易搞错。

    [回复]

发表评论