为什么我们不能在C中多次初始化结构?

时间:2015-03-01 18:02:38

标签: c

为什么这在C中是非法的?将p重新初始化为不同的位置有什么问题?通过单独更改字段值可以实现相同的效果,因此我不明白为什么不能在p = {1,2}的情况下一步完成。

struct posn {
    int x;
    int y;
};

int main() {
    struct posn p = {3, 4};
    p = {1, 2}; //Causes error
    // must do p.x = 1; p.y = 2;
    return 0;
}

3 个答案:

答案 0 :(得分:5)

指明语言的方式。

为了与C&C的一般设计保持一致,为了允许p = {1, 2}{1, 2}必须是一个表达式。但是什么类型的?它可能是int[2],或struct { int a; short s; },或许多其他内容。

使用C99,可以使用复合文字,它明确提到类型(从而解决了如何确定类型的问题),括号内的类型名称后跟{}括号中的初始值设定项: / p>

p = (struct posn){1, 2};

答案 1 :(得分:4)

您可以使用复合文字。例如

#include <stdio.h>

struct posn 
{
    int x;
    int y;
};

int main(void) 
{
    struct posn p = { 3, 4 };
    p = ( struct posn ){ 1, 2 };

    printf( "p.x = %d, p.y = %d\n", p.x, p.y );

    return 0;
}

程序输出

p.x = 1, p.y = 2

这是有效的,因为与数组相对的结构具有复制赋值运算符。 但是,您可以在结构中包含一个数组,并使用相同的技巧重新分配数组。

这是一个例子

#include <stdio.h>

struct posn 
{
    int a[2];
};

int main(void) 
{
    struct posn p = { { 3, 4 } };
    p = ( struct posn ){ { 1, 2 } };

    printf( "p.a[0] = %d, p.a[1] = %d\n", p.a[0], p.a[1] );

    return 0;
}

因此它在C ++中看起来像std::array。)

答案 2 :(得分:0)

这不完全正确,你不能使用初始化列表,但你当然可以随时初始化或更精确地更改结构的成员,试试这个

p.x = 1;
p.y = 2;

初始化列表只能是声明的一部分。