【问题标题】:Statically initializing array inside struct upon struct initialization在结构初始化时静态初始化结构内的数组
【发布时间】:2016-07-04 09:47:11
【问题描述】:

我正在尝试通过使用静态分配的数组来构建一个环形缓冲区(要求,已经构建了动态,后来决定使用静态)。但是,我希望有一个通用的环形缓冲区结构,可以在其中实例化不同大小的数组。 我有这个结构:

typedef struct measurementsRingBuffer
{   
    int maxSize;
    int currentSize;
    double measurementsArray[MEAS_ARRAY_CAPACITY];
} measurementsRingBuffer;

我通过以下方式实例化结构:

measurementsRingBuffer buffer = { .maxSize = MEAS_ARRAY_CAPACITY, .currentSize = 0 };

有什么方法可以在结构实例化时定义数组大小,而不是在结构本身中定义它? 听起来不太可能,但我会试一试。

【问题讨论】:

  • 具有静态存储时长?
  • 我不确定,但如果你使用指针而不是数组,并且如果数组是结构的最后一个成员,那么我想你可以在分配内存时决定它的大小.无论如何,而不是 sizeof(measurementsRingBuffer) 你将拥有所有成员的累积大小加上 n*sizeof(double) 与 n 你的数组的大小
  • 是实时系统,对内存消耗有严格要求。它需要知道需要多少内存。
  • 如果数组是在定义结构之前定义的,你可以简单地使用sizeof(the_array)作为数组大小。

标签: c arrays memory struct


【解决方案1】:

您可以使用指向数组的指针:

typedef struct measurementsRingBuffer
{   
    int maxSize;
    int currentSize;
    double* measurementsArray ;
} measurementsRingBuffer;

double small_array[10];
measurementsRingBuffer small = { .maxSize = 10 , .measurementsArray = small_array } ;

甚至是复合文字:

measurementsRingBuffer small = { .maxSize = 10 , .measurementsArray = ( double[10] ){ 0 } } ;

请注意,如果复合文字是在函数体之外定义的,它具有静态存储持续时间。

【讨论】:

  • 不错!这听起来很正确,会尝试一下。非常感谢!
猜你喜欢
  • 2014-10-07
  • 2021-01-31
  • 1970-01-01
  • 2013-09-22
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
  • 1970-01-01
相关资源
最近更新 更多