在struct中声明int数组

时间:2013-06-22 12:00:48

标签: c arrays struct

在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
};

3 个答案:

答案 0 :(得分:25)

首先,有两种方式:

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

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

#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;

干杯。

答案 1 :(得分:16)

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;

答案 2 :(得分: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标准不兼容,因此汇总了#fo;&#39;有一些分组,其中一些是括号,而另一些则没有。因此,如果您删除内部括号 代表阵列&#39; tmp&#39;它会编译而不会失败。例如。

struct Foo foos[] = {
  {123, tmp},   // works
  {222,  11,22,33 },  // would compile perfectly.
}