在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
};
答案 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.
}