20

在 C 中,我定义了struct下面的内容,并想内联初始化它。foos初始化后结构内的字段和数组都不会改变。第一个块中的代码工作正常。

struct Foo {
  int bar;
  int *some_array;
};

typedef struct Foo Foo;

int tmp[] = {11, 22, 33};
struct Foo foos[] = { {123, tmp} };

但是,我真的不需要这个tmp领域。事实上,它只会弄乱我的代码(这个例子有点简化)。所以,我想在声明中some_array声明foos. 不过,我无法获得正确的语法。也许some_array应该以不同的方式定义该领域?

int tmp[] = {11, 22, 33};
struct Foo foos[] = {
  {123, tmp},                    // works
  {222, {11, 22, 33}},           // doesn't compile
  {222, new int[]{11, 22, 33}},  // doesn't compile
  {222, (int*){11, 22, 33}},     // doesn't compile
  {222, (int[]){11, 22, 33}},    // compiles, wrong values in array
};
4

3 回答 3

29

首先,有2种方式:

  • 你知道数组的大小
  • 你不知道那个尺寸。

第一种情况是静态编程问题,并不复杂:

#define Array_Size 3

struct Foo {
    int bar;
    int some_array[Array_Size];
};

您可以使用此语法来填充数组:

struct Foo foo;
foo.some_array[0] = 12;
foo.some_array[1] = 23;
foo.some_array[2] = 46;

当您不知道数组的大小时,这是一个动态编程问题。你得问尺寸。

struct Foo {

   int bar;
   int array_size;
   int* some_array;
};


struct Foo foo;
printf("What's the array's size? ");
scanf("%d", &foo.array_size);
//then you have to allocate memory for that, using <stdlib.h>

foo.some_array = (int*)malloc(sizeof(int) * foo.array_size);
//now you can fill the array with the same syntax as before.
//when you no longer need to use the array you have to free the 
//allocated memory block.

free( foo.some_array );
foo.some_array = 0;     //optional

其次, typedef 很有用,所以当你写这个时:

typedef struct Foo {
   ...
} Foo;

这意味着您将“struct Foo”单词替换为:“Foo”。所以语法将是这样的:

Foo foo;   //instead of "struct Foo foo;

干杯。

于 2014-01-26T13:26:02.983 回答
17
int *some_array;

这里,some_array实际上是一个指针,而不是一个数组。你可以这样定义它:

struct Foo {
  int bar;
  int some_array[3];
};

还有一件事,重点typedef struct Foo Foo;是使用Foo而不是 struct Foo. 你可以像这样使用 typedef:

typedef struct Foo {
  int bar;
  int some_array[3];
} Foo;
于 2013-06-22T12:06:10.500 回答
2

我的答案是针对以下代码部分:-

int tmp[] = {11, 22, 33};
struct Foo foos[] = {
  {123, tmp},   // works
  {222, {11, 22, 33}},  // doesn't compile
  {222, new int[]{11, 22, 33}},  // doesn't compile
  {222, (int*){11, 22, 33}},  // doesn't compile
  {222, (int[]){11, 22, 33}},  // compiles, wrong values in array
};

所有上述编译问题都是由于它与 ANSI 标准不兼容,聚合 'foos' 具有子聚合,其中一些包含在括号中,而另一些则没有。因此,如果您删除内部括号来表示数组 'tmp',它将不会编译失败。例如。

struct Foo foos[] = {
  {123, tmp},   // works
  {222,  11,22,33 },  // would compile perfectly.
}
于 2016-06-01T08:43:09.123 回答