【问题标题】:define struct with variable length vectors in C在 C 中定义具有可变长度向量的结构
【发布时间】:2021-09-12 07:43:02
【问题描述】:

我需要声明一个带有可变长度向量的结构..

使用以下解决方案:

#include <stdio.h>

struct S
{
  int len;
  double *x;
  double *y;
  double z;

};

int main()
{
double x[] = { 1.,  2.,  3.,  4.  };
double y[] = { 1.1, 2.2, 3.5, 4.0 };

//struct S myS = { .len = 4, .x = x, .y = y,  .z = 5.1 };
struct S myS = { 4, x, y, 5.1 };
return 0;
}

【问题讨论】:

  • 您可以使用指针来代替double *x,也可以将数组大小设置为最大值,例如double x[10000]
  • 你不能做你正在尝试的事情。 C 有一种叫做灵活数组成员的东西,但只能有一个,而且它必须是最后一个成员。此外,您无法使用初始化程序设置其大小。

标签: c struct


【解决方案1】:

struct S 更改为指向double 的指针:

struct S {
   double  *x;
   double  *y;
   double  z;
};

创建struct S时,首先创建数组供成员指向:

double SampleX[] = { 1.,  2.,  3.,  4.  };
double SampleY[] = { 1.1, 2.2, 3.5, 4.0 };

然后用指向该数据的成员定义结构:

struct S myS = { .x = SampleX, .y = SampleY, .z = 5.1 };

如果您按顺序初始化所有成员,则不需要指定的初始化器.x = 等,但它们在此处显示为一个选项。

还添加了一些知道有多少元素的方法。如果它们可以变化,则传递此结构的例程无法知道有多少元素,除非以某种方式向它们提供该信息,例如通过结构中的另一个成员或传递给例程的某些参数。

创建成员指向的数组可以通过上面显示的其他方式完成。您可以使用复合文字:

struct S myS = {
    .x = (double []) { 1.,  2.,  3.,  4.  },
    .y = (double []) { 1.1, 2.2, 3.5, 4.0 },
    .z = 5.1
};

或者您可以使用malloc 为数组分配内存。 (如果您使用malloc,也可以使用free 释放内存,但退出程序时通常可以省略。)

【讨论】:

  • 感谢所有帮助的人!
猜你喜欢
  • 2015-08-09
  • 2014-11-14
  • 2013-11-26
  • 1970-01-01
  • 2021-11-01
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 2013-08-23
相关资源
最近更新 更多