c - 如何创建三维动态数组,其中维度之一在c编译时已知

标签 c multidimensional-array structure dynamic-arrays

如何创建一个在编译时仅知道其中一个维度的三维数组。 数组的内容是结构体值,如下

struct mat
{
char x[3];
int a;
}

struct samp
 {
   int a;
   struct mat;
 }

该数组应该存储“samp”,其大小为

   struct samp samp_arr[unknown][10][unknown];

程序第一次运行时,samp_arr 的第一个维度将为 1,最后一个维度将随着放入数组中的 samp 结构的数量而增长。一段时间后,第一个维度应该增加一,并且任何未定义数量的 samp 结构将被放入其中。等等

最佳答案

如果您有符合 C99 的编译器,则无需重新发明轮子,即使具有动态边界的多维数组也是该语言的一部分。

struct samp samp_arr[unknown][10][unknown];

(假设unknown是一个计算结果为您喜欢的值的表达式。)

但是,通常在堆栈上分配这么大的变量是一个坏主意,因此您应该使用 malloc 和 friend 来分配它:

struct samp (*samp_arr)[10][unknown] = malloc(sizeof(struct samp[unknown][10][unknown]));
...
// use it
samp_arr[i][j][k].a = ...
...
free(samp_arr);

这声明了一个指向二维数组的指针。

Wenn 将数组传递给可以执行类似操作的函数,您只需注意数组边界在参数列表中排在第一位,以便在涉及数组本身时知道它们:

int fun(size_t r, size_t s, size_t t, struct samp (*A)[s][t]) {
 ...
}

关于c - 如何创建三维动态数组,其中维度之一在c编译时已知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9451091/

相关文章:

c - 用于验证 C 程序中所有结构的最佳打包的工具

c - 用 nanosleep 替换 usleep

C:非 ASCII 文本数据的 char 与 unsigned char

C - 如何打印出字符串数组中双引号之间的字符?

c# .net 覆盖多维数组的 ToString

c - 如何按字典顺序对结构中的字符串进行排序?

c - 在 C 语言中,传递给函数的 char* 如何填充文本?

c - 在链接列表中搜索

javascript - 如何将以下对象数组解析为以下格式以进行显示

使用结构体计算加薪的C程序