2

尝试在 C 中初始化一个数组时遇到一个奇怪的错误——有人知道为什么会发生这种情况吗?

我有一个全局变量:

static my_type foo[6];

在包含的头文件中,我有:

typedef uint32_t my_type[5];

然后我在与全局变量相同的文件中的一个函数中尝试执行以下操作:

foo = {{1, 2, 3, 4, 5}, {1, 2, 3, 4, 6}, {1, 2, 3, 4, 7}, {1, 2, 3, 4, 8}, {1, 2, 3, 4, 9}, {1, 2, 3, 4, 10}};

编译器 (GCC4) 在 '{' token' 之前给出错误'expected expression'。

任何人都知道出了什么问题以及如何解决它?

干杯!

4

2 回答 2

4

如果您在 C99 以下:

ISO C99 支持复合文字。复合文字看起来像包含初始化程序的强制转换。它的值是强制转换中指定类型的对象,包含初始化器中指定的元素;它是一个左值。作为扩展,GCC 支持 C89 模式和 C++ 中的复合文字。

foo必须是指针

#include <stdio.h>
#include <stdint.h>

typedef uint32_t my_type[5];

int main(void)
{
    int i, j;
    my_type *foo;

    foo = ((my_type[]) {
      {1, 2, 3, 4, 5},
      {1, 2, 3, 4, 6},
      {1, 2, 3, 4, 7},
      {1, 2, 3, 4, 8},
      {1, 2, 3, 4, 9},
      {1, 2, 3, 4, 10}
    });
    for (i = 0; i < 6; i++) {
        for (j = 0; j < 5; j++) {
            printf("%d ", foo[i][j]);
        }
        printf("\n");
    }
    return 0;
}
于 2013-10-29T10:46:39.390 回答
4

那不是初始化,那是赋值。初始化必须是一条语句:

static my_type foo[6] = {{1, 2, 3, 4, 5},
                         {1, 2, 3, 4, 6},
                         {1, 2, 3, 4, 7},
                         {1, 2, 3, 4, 8},
                         {1, 2, 3, 4, 9},
                         {1, 2, 3, 4, 10}};

您不能使用此语法在 C89 中分配给整个数组。你可以做的是memcpyconst

void initialize_foo()
{
    static const my_type init[6] =
                        {{1, 2, 3, 4, 5},
                         {1, 2, 3, 4, 6},
                         {1, 2, 3, 4, 7},
                         {1, 2, 3, 4, 8},
                         {1, 2, 3, 4, 9},
                         {1, 2, 3, 4, 10}};
    assert(sizeof(foo) == sizeof(init));
    memcpy(foo, init, sizeof(foo));
}
于 2013-10-29T10:37:29.030 回答