C语言中的结构数组

C语言中的结构数组,c,arrays,struct,C,Arrays,Struct,我正在尝试创建一个结构数组以及指向该数组的指针。我不知道数组将有多大,所以它应该是动态的。我的结构将如下所示: typedef struct _stats_t { int hours[24]; int numPostsInHour; int days[7]; int numPostsInDay; int weeks[20]; int numPostsInWeek; int totNumLinesInPosts; int numPostsAnalyzed; } stats_t; 。。

我正在尝试创建一个结构数组以及指向该数组的指针。我不知道数组将有多大,所以它应该是动态的。我的结构将如下所示:

typedef struct _stats_t
{
 int hours[24]; int numPostsInHour;
 int days[7]; int numPostsInDay;
 int weeks[20]; int numPostsInWeek;
 int totNumLinesInPosts;
 int numPostsAnalyzed;

} stats_t;
。。。对于我要分析的每个文件(未知数量),我需要有多个这样的结构。我不知道该怎么做。由于数组大小的限制,我不喜欢以下方法:

# define MAX 10
typedef struct _stats_t
{
 int hours[24]; int numPostsInHour;
 int days[7]; int numPostsInDay;
 int weeks[20]; int numPostsInWeek;
 int totNumLinesInPosts;
 int numPostsAnalyzed;

} stats_t[MAX];
那么我如何创建这个数组呢?另外,指向该数组的指针是否看起来像这样

stats_t stats[];
stats_t *statsPtr = &stats[0];
使用malloc():


指针的第二个选项很好

如果要动态分配内容,请尝试:

stats_t* theStatsPointer = (stats_t*) malloc( MAX * sizeof(stats_t) );
正如罗兰所说

只是别忘了

free(theStatsPointer);

完成后。

malloc
是你的朋友

stats_t stats[] = (stats_t*)malloc(N * sizeof(stats_t));

stats
排序是指向数组的指针。或者您可以使用
stats[3]
语法,就好像它被显式声明为数组一样。

通常是这样做的:

size_t n = <number of elements needed>
stats_t *ptr = malloc (n * sizeof (stats_t));
size\u t n=
stats_t*ptr=malloc(n*sizeof(stats_t));
然后,填上,

for (size_t j = 0;  j < n;  ++j)
{
   ptr [j] .hours = whatever
   ptr [j] .days = whatever
   ...
}
(尺寸j=0;j { ptr[j].小时数=任意值 ptr[j].天数=任意值 ... }

根据您对其他答案的回复,您似乎需要一个动态数据结构,如链表。查看一组设施。

问题:您能否管理
int
的动态数组?您能管理结构的静态数组吗?如果这两个问题的答案都是“否”,我建议先解决这个问题。一旦你能处理好这两个问题,答案应该是显而易见的。最后,您可以在堆栈溢出上找到上述两个方面的帮助。
\u t
后缀是为系统头保留的。别用它,问题是我现在不知道。。。我不知道我要处理多少文件。a)你不能声明像
stats\u t stats[]
这样的东西。这是一个没有大小的数组,不是指针。您需要
stats\u t*stats
。b) 我强烈建议不要在C代码中强制转换
malloc()
的返回值,也不要使用
sizeof(stats\u t)
,这两种方法都会使更改
stats
的类型变得更加复杂。演员阵容也有其他与之相关的、不太合理的污名。你建议用什么来代替
sizeof
sizeof
:P我更喜欢使用
sizeof*ptr
而不是
sizeof(type)
,因为如果
ptr
的类型改变,
sizeof*ptr
会自动调整到正确的大小,而
sizeof(type)
必须手动更改,因此更容易出错。在这种情况下,这并不重要,因为我怀疑
stats
的类型是否会改变,但在其他情况下,这可能会有所帮助。@ChrisLutz讽刺的是,我刚刚在我的C代码中第一次使用了你的建议,然后在60秒内不得不重命名变量,因此也不得不更改
sizeof
参数!问题是我现在不认识MAX。。。我不知道要处理多少文件,所以设置一个最大值是个坏主意。我不想重复我自己的话,但由于您的代码与sblom几乎相同(除了正确声明的
theStatsPointer
),请参见我评论中的b点)。但是+1提醒我们要
free()
@Chris:我在发布后才看到sblorn的。在我发帖时,我只看到罗兰的帖子。@Hristo:MAX不一定是常数。如果确实必须这样做,那么如果超出了现有的内存块(大小为MAX stats_t structs),则始终可以使用realloc()。哦!刚才看到Chris Lutz的评论也提到了。。。。对不起,克里斯!;-)a) 您应该使用
size\u t
而不是
int
int
是一种有符号类型,我们很少希望分配长度为-1的数组。b) 我会使用
sizeof*ptr
而不是
sizeof(stats)
,但这并不重要。谢谢您的回复。我知道如何分配和访问内存,但问题是我将一次malloc一个结构。每次出现一个新文件时,我都会为它malloc另一个结构。因此,我不能在malloc'n'结构之后再回去处理它,而是需要说“这是数组,每次出现新文件时都要展开(添加)一次。”这有意义吗?@Hristo:为此,请使用
realloc()
函数调整分配给
malloc()
的数组的大小。这就是为什么叫做动态分配。啊。。。谢谢这就是我要找的。现在我只需要了解它的工作原理和语法。每次数组增长时使用realloc是非常低效的。最好是每次将数组大小增加一倍。您需要跟踪分配的数量和使用的数量。另一种解决方案是使用TAILQ或类似工具。编辑:抱歉,这太旧了,没有看到。队列(3)函数不是标准的。什么样的C数据结构库是标准的?唯一“标准”的C数据结构(当“标准”表示ISO C99时)是指针、数组、结构和并集。ISOC99对列表、集合、地图、树等等一无所知。所有这些东西都必须使用外部库。