gpt4 book ai didi

c - 在结构中声明数组

转载 作者:太空宇宙 更新时间:2023-11-04 06:34:44 26 4
gpt4 key购买 nike

我正在尝试为包含“quote”类型数组的循环缓冲区创建一个结构。但是,引号数组必须以 10 的大小开始。我想弄清楚我是在我的 .h 文件中还是在我的 .c 文件中声明了 10 的大小。我的两个文件如下:

.h文件:

typedef struct{
unsigned int time;
double rate;

}quote;

typedef struct{

unsigned int testNum;
quote quoteBuffer[];

}cbuf;

cbuf* cbuf_init();

.c文件:

cbuf* cbuf_init(){

cbuf *buffer = (cbuf *)calloc(1,sizeof(cbuf));
buffer->testNum = 1;
quote newQuote = {1,1.00};
buffer->quoteBuffer[1] = newQuote;
return buffer;


}

这些显然只是测试值,但是如果我想专门使 cbuf 结构中的引号数组以 10 的大小开始,我会在 .h 文件中声明为:

typedef struct{

unsigned int testNum;
quote quoteBuffer[10];

}cbuf;

或者以其他方式在 .c 文件中?

最佳答案

有两种方法可以在结构中使用动态数组。显而易见的当然是将其作为指针,并在需要时动态分配(或重新分配)。


另一种是有一个大小为 1 的数组,然后分配一个比结构体更大的大小,以容纳该数组:

typedef struct {
unsigned int testNum;
quote quoteBuffer[1];
} cbuf;

cbuf *cbuf_init(const size_t num_quotes) {
/* Allocate for the `cbuf` structure, plus a number of `quote`
* structures in the array
*/
cbuf *buffer = malloc(sizeof(cbuf) + (num_quotes - 1) * sizeof(quote));

/* Other initialization */

return buffer;
}

/* If more quotes are needed after initial allocation, use this function */
cbuf *cbuf_realloc(cbuf *buffer, const size_t new_num_quotes) {
buffer = realloc(buffer, sizeof(cbuf) + (new_num_quotes - 1) * sizeof(quote));

/* Other initialization */

return buffer;
}

现在你可以像普通数组一样使用这个数组了:

cbuf *buffer = cbuf_init();
buffer->quoteBuffer[5].time = 123;

注意:我只为 9 quote 结构分配了额外的空间,但声明我分配了 10 个。原因是 cbuf 结构在它的数组中已经包含了一个 quote 结构。 1 + 9 = 10。:)

注意 2: 为了向后兼容,我将 quote 数组放在 cbuf 结构中,其中已有一个条目。在结构中使用没有大小的数组在 C 世界中是相当新鲜的。

关于c - 在结构中声明数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16274288/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com