【问题标题】:Possible to initialize an array after the declaration in C?可以在 C 中声明后初始化数组吗?
【发布时间】:2012-02-11 18:28:40
【问题描述】:

有没有办法在实际初始化之前声明这样的变量?

    CGFloat components[8] = {
        0.0, 0.0, 0.0, 0.0,
        0.0, 0.0, 0.0, 0.15
    };

我希望它声明这样的东西(除非这不起作用):

    CGFloat components[8];
    components[8] = {
        0.0, 0.0, 0.0, 0.0,
        0.0, 0.0, 0.0, 0.15
    };

【问题讨论】:

  • @PaulTomblin:不像 OP 所建议的那样,但可以通过几种不同的方式分配给数组。

标签: c variable-declaration


【解决方案1】:

你不能分配给数组,所以基本上你不能做你建议的事情,但在 C99 中你可以这样做:

CGFloat *components;
components = (CGFloat [8]) {
    0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.15
};

( ){ } 运算符称为复合文字 运算符。这是 C99 的功能。

请注意,在此示例中,components 被声明为指针而不是数组。

【讨论】:

  • 这可以避免错误,但它不会填充数组。我试图在 Quartz 中使用这个想法来设置两个 CGFloat 数组的默认值来保存颜色值,但它不起作用。我初始化指针 static CGFloat * color,然后我尝试这种方法并执行 color = (CGFloat[4]){1.0, 0.0, 0.0, 1.0};然后调用 CGContextSetFill(context, color) 它不绘制。如果我只是做静态颜色[4];然后颜色 [0] = 1.0; color[3] = 1.0 并重复填充调用,它按预期工作。我究竟做错了什么?谢谢。
  • 这是题外话,但这也适用于 c++ 吗?它给了我一个error: taking address of temporary array
  • @ArchLinuxTux 复合文字在 C++ 中不受支持(一些编译器支持它作为扩展)。
  • @ouah 但它会改变components 的地址还是可以使用它在特定地址写入数组?
【解决方案2】:

如果你把你的数组包装在一个结构体中,它就变成了可赋值的。

typedef struct
{
    CGFloat c[8];
} Components;


// declare and initialise in one go:
Components comps = {
    0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.15
};


// declare and then assign:
Components comps;
comps = (Components){
    0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.15
};


// To access elements:
comps.c[3] = 0.04;

如果你使用这种方法,你也可以从方法中返回Components结构,这意味着你可以创建函数来初始化和分配给结构,例如:

Components comps = SomeFunction(inputData);

DoSomethingWithComponents(comps);

comps = GetSomeOtherComps(moreInput);

// etc.

【讨论】:

  • @ouah 但它会改变components 的地址还是可以使用它在特定地址写入数组?
【解决方案3】:

数组和结构的符号只在初始化时有效,所以不。

【讨论】:

    猜你喜欢
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 2018-05-20
    相关资源
    最近更新 更多