初始化包含数组的结构
Initializing struct containing arrays
我在C 中有一个结构,它的成员是float 数组。我想在编译时像这样初始化它:
typedef struct curve {
float *xs;
float *ys;
int n;
} curve;
curve mycurve1 = {
{1, 2, 3},
{4, 2, 9},
3
};
curve mycurve2 = {
{1, 2, 3, 4},
{0, 0.3, 0.9, 1.5},
4
};
但是我遇到编译错误。
一种可能的解决方案是在结构中使用数组而不是指针。这是来自此处的一个非常相似的问题的公认答案:,但该方法的问题是我不知道 typedef 时的数组大小。不仅如此,我可能还想初始化另一条更大的曲线。
另一种方法可能是使用 malloc,但我发现这太过分了,因为我在编译时就知道数组大小,而且我不需要在 运行 期间更改它。
我不知道其他可能有用的方法。也许将数组转换为指针?? - 我真的不知道该如何处理。
您不能使用包含多个初始值设定项的花括号列表来初始化标量对象,例如指针。
但是你可以使用复合文字。
这是一个演示程序。
#include <stdio.h>
typedef struct curve {
float *xs;
float *ys;
int n;
} curve;
int main(void)
{
curve mycurve1 =
{
( float[] ){ 1, 2, 3 },
( float[] ){ 4, 2, 9 },
3
};
curve mycurve2 =
{
( float[] ){ 1, 2, 3, 4 },
( float[] ){ 0, 0.3, 0.9, 1.5 },
4
};
for ( int i = 0; i < mycurve1.n; i++ )
{
printf( "%.1f ", mycurve1.xs[i] );
}
putchar( '\n' );
for ( int i = 0; i < mycurve2.n; i++ )
{
printf( "%.1f ", mycurve2.ys[i] );
}
putchar( '\n' );
return 0;
}
它的输出是
1.0 2.0 3.0
0.0 0.3 0.9 1.5
好答案的建议。
常数
时使用const
because I know the array size at compile time and I don't need it to change during run-time.
考虑 const curve mycurve1 = ...
。这允许 select 优化,识别误用并允许将 &mycurve1
传递给 bar(const curve *)
。 const float [...
也允许将 mycurve1.xs
传递给 foo(const float *)
.
避免幻数
#define CURVE1_N 3
const curve mycurve1 = {
( const float[CURVE1_N] ){ 1, 2, 3 },
( const float[CURVE1_N] ){ 4, 2, 9 },
CURVE1_N
};
我在C 中有一个结构,它的成员是float 数组。我想在编译时像这样初始化它:
typedef struct curve {
float *xs;
float *ys;
int n;
} curve;
curve mycurve1 = {
{1, 2, 3},
{4, 2, 9},
3
};
curve mycurve2 = {
{1, 2, 3, 4},
{0, 0.3, 0.9, 1.5},
4
};
但是我遇到编译错误。
一种可能的解决方案是在结构中使用数组而不是指针。这是来自此处的一个非常相似的问题的公认答案:,但该方法的问题是我不知道 typedef 时的数组大小。不仅如此,我可能还想初始化另一条更大的曲线。
另一种方法可能是使用 malloc,但我发现这太过分了,因为我在编译时就知道数组大小,而且我不需要在 运行 期间更改它。
我不知道其他可能有用的方法。也许将数组转换为指针?? - 我真的不知道该如何处理。
您不能使用包含多个初始值设定项的花括号列表来初始化标量对象,例如指针。
但是你可以使用复合文字。
这是一个演示程序。
#include <stdio.h>
typedef struct curve {
float *xs;
float *ys;
int n;
} curve;
int main(void)
{
curve mycurve1 =
{
( float[] ){ 1, 2, 3 },
( float[] ){ 4, 2, 9 },
3
};
curve mycurve2 =
{
( float[] ){ 1, 2, 3, 4 },
( float[] ){ 0, 0.3, 0.9, 1.5 },
4
};
for ( int i = 0; i < mycurve1.n; i++ )
{
printf( "%.1f ", mycurve1.xs[i] );
}
putchar( '\n' );
for ( int i = 0; i < mycurve2.n; i++ )
{
printf( "%.1f ", mycurve2.ys[i] );
}
putchar( '\n' );
return 0;
}
它的输出是
1.0 2.0 3.0
0.0 0.3 0.9 1.5
常数
时使用const
because I know the array size at compile time and I don't need it to change during run-time.
考虑 const curve mycurve1 = ...
。这允许 select 优化,识别误用并允许将 &mycurve1
传递给 bar(const curve *)
。 const float [...
也允许将 mycurve1.xs
传递给 foo(const float *)
.
避免幻数
#define CURVE1_N 3
const curve mycurve1 = {
( const float[CURVE1_N] ){ 1, 2, 3 },
( const float[CURVE1_N] ){ 4, 2, 9 },
CURVE1_N
};