在C中奇怪使用花括号

时间:2012-01-05 15:24:12

标签: objective-c c initialization structure

很抱歉这个简单的问题,但我正在度假阅读一本关于核心音频的书,并且没有我的C或Objective C书籍......

这个变量定义中的大括号是什么?

MyRecorder recorder = {0};

6 个答案:

答案 0 :(得分:24)

假设MyRecorderstruct,这是sets every member to their respective representation of zero0表示整数,NULL表示指针等。)

实际上这也适用于所有其他数据类型,如intdouble,指针,数组,嵌套结构,...,您可以想象的一切(感谢pmg指出这一点!)< / p>

更新:从上面链接的网站中提取的引用,引用C99的最终草案:

  

[6.7.8.21]如果括号括起的列表中的初始值设定项较少   比聚合的元素或成员,[...]剩余的   aggregate应该与对象一样隐式初始化   有静态存储时间。

答案 1 :(得分:9)

根据C99标准,它将recorder结构的所有成员初始化为0。看起来它似乎用0位初始化结构的每一位。但对于每个编译器而言都不是这样。

请参阅此示例代码

#include<stdio.h>

struct s {
    int i;
    unsigned long l;
    double d;
};

int main(){
    struct s es = {0};
    printf("%d\n", es.i);
    printf("%lu\n", es.l);
    printf("%f\n", es.d);
    return 0;
}

这是输出。

$ ./a.out 
0
0
0.000000

答案 2 :(得分:4)

答案 3 :(得分:3)

实际上,它并没有初始化结构的所有元素,只是第一个元素。但是,其他的自动初始化为0,因为这是C标准要求做的。

如果你把: MyRecorder录音机= {3};

第一个元素为3,其他元素为0。

答案 4 :(得分:0)

MyRecorder可能是以下之一,并且您尝试使用零初始化该元素的所有元素

typedef struct _MyRecorder1 {
    int i;
    int j;
    int k;
}MyRecorder1;

typedef int MyRecorder2[3];

答案 5 :(得分:0)

与C ++ 11不同,在C99中,初始化括号中必须至少包含一个元素。

C ++ 11结构:

MyRecorder recorder{};

C结构:

MyRecorder recorder = {0};