如何在C中创建一个包含静态数组的动态数组?
我的程序解析代码,当它解析代码时,我需要跟踪每x行(可能每10行左右)它通过每个关键字的多少个实例,我计划稍后用gnuplot创建一个直方图,但这并不重要 所以有13个关键字,我可以用一个0的数组轻松地统计它们,其中每个索引代表一个关键字,每当我找到一个关键字,我就会将它的索引增加1。好简单如何在C中创建一个包含静态数组的动态数组?,c,arrays,pointers,memory-management,keyword,C,Arrays,Pointers,Memory Management,Keyword,我的程序解析代码,当它解析代码时,我需要跟踪每x行(可能每10行左右)它通过每个关键字的多少个实例,我计划稍后用gnuplot创建一个直方图,但这并不重要 所以有13个关键字,我可以用一个0的数组轻松地统计它们,其中每个索引代表一个关键字,每当我找到一个关键字,我就会将它的索引增加1。好简单 int keywordcount[13]={0}; 问题是我需要每10行创建一个新的keywordcount,我不知道文件有多少代码行。这告诉我应该有一个动态数组keywordcount数组 如何在C中声
int keywordcount[13]={0};
问题是我需要每10行创建一个新的keywordcount
,我不知道文件有多少代码行。这告诉我应该有一个动态数组keywordcount
数组
如何在C中声明这个数组的动态数组,以及如何向其中添加
keywordcount
数组?我仍然对C中的多维数组感到困惑。我不知道是否应该将它声明为指针数组或什么,我不知道如何为它分配一个新的keywordcount
数组,该数组在创建keywordcount
的函数返回时不会消失。如果有不清楚的地方,请告诉我。假设将创建多少关键字计数。比如说,你几乎可以肯定其中有10个会被创建
可以动态声明一个包含10行13列的二维数组
现在,keywordcount[0]
将是第一个keywordcount数组(大小为13)的索引,依此类推
现在,如果在实际操作中发现需要10个以上的关键字计数数组,可以使用动态增加2D数组的大小
PS:一个很好的建议是,每次需要增加2D数组的大小时,将其行大小增加一倍(而不是每次增加一行,这样可以避免重新定位,这在某些情况下可能会损害性能)。您可以使用malloc()
或calloc()
创建静态数组的动态数组。例如,这将keywordcount\u arr
定义为指向13个int
s数组的指针(这里为max\u行
这样的数组分配了足够的内存):
如果在此处使用typedef
,可能会使代码更易于阅读和写入:
typedef int KW_Count[13];
/* ... */
KW_Count *keywordcount_arr = calloc(max_lines, sizeof *keywordcount_arr);
可以使用二维数组索引将索引编入分配的内存:
for (size_t i = 0; i < 13; i++) {
keywordcount_arr[0][i] = i;
}
以下是一个示例程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUM_KEYWORDS 13
typedef int KW_Count[NUM_KEYWORDS];
int main(void)
{
size_t max_lines = 10;
size_t num_lines = 0;
KW_Count *keywordcount_arr = calloc(max_lines, sizeof *keywordcount_arr);
if (keywordcount_arr == NULL) {
perror("Allocation failure");
/* Handle error... perhaps: */
exit(EXIT_FAILURE);
}
/* Store keyword counts directly in keywordcount_arr[] */
++num_lines;
for (size_t i = 0; i < NUM_KEYWORDS; i++) {
keywordcount_arr[0][i] = i;
}
/* Or use memcpy() if an existing array must be stored */
++num_lines;
KW_Count keywordcount = { 0, 2, 0, 0, 3, 1, 0, 0, 0, 1, 2, 0, 1 };
memcpy(keywordcount_arr[1],
keywordcount,
sizeof *keywordcount * NUM_KEYWORDS);
/* Use realloc() to grow the dynamic array as needed */
max_lines *= 2;
KW_Count *temp = realloc(keywordcount_arr,
sizeof *keywordcount_arr * max_lines);
if (temp == NULL) {
perror("Unable to reallocate");
/* Handle error */
} else {
keywordcount_arr = temp;
}
/* Use realloc() to trim the dynamic array to final size */
temp = realloc(keywordcount_arr, sizeof *keywordcount_arr * num_lines);
if (temp == NULL) {
perror("Unable to reallocate");
/* Handle error */
} else {
keywordcount_arr = temp;
}
/* Display array contents */
for (size_t i = 0; i < num_lines; i++) {
for (size_t j = 0; j < NUM_KEYWORDS; j++) {
printf("%5d", keywordcount_arr[i][j]);
}
putchar('\n');
}
/* Cleanup */
free(keywordcount_arr);
return 0;
}
不要触摸2D数组、数组数组、指针数组、指向数组的指针或任何类似的废话
将静态大小的数组包装在结构中
typedef struct
{
int keyword_count[13];
} fragment_info;
像创建任何其他动态数组一样,创建一个动态数组fragment\u info
:
fragment_info* infos = malloc(initial_capacity * sizeof(*infos));
....
fragment_info* new_infos = realloc(infos, new_capacity * sizeof(*new_infos));
现在,如果您想存储关于10行片段的附加信息,您可以在一个自然的位置保存它。只需在结构中添加更多字段
使用typedef声明13字节数组类型,然后在这种类型的数组上使用realloc。不,不能在声明为int关键字计数[10][13]的数组上使用realloc()代码>。为了使用这种方法,您必须从一开始就动态地分配它。
typedef struct
{
int keyword_count[13];
} fragment_info;
fragment_info* infos = malloc(initial_capacity * sizeof(*infos));
....
fragment_info* new_infos = realloc(infos, new_capacity * sizeof(*new_infos));