【问题标题】:how to create three dimension dynamic array where one of the dimensions is known at compile time in c如何在c中的编译时创建其中一个维度已知的三维动态数组
【发布时间】:2012-03-16 02:29:32
【问题描述】:

如何创建一个在编译时只知道其中一个维度的三维数组。 数组的内容是struct values as

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 结构都将被放入其中。以此类推

【问题讨论】:

  • @CarlNorum:我只是有想法,而不是技术技能。所以我什么都没试过。
  • 你是在重新发明数据库还是什么?如果您没有“技术技能”,也许您需要在实施“想法”之前阅读,因为其他一些具有技术技能的人已经弄清楚了大部分内容。
  • @John 你愿意为你的项目使用 GLib 吗?
  • @ivancho:问一些你不知道的事情是犯罪吗?作为一名学生,我有一点编程经验,现在我想向像你这样有经验的朋友学习一些东西。
  • @John 问题在于,除了您可以先咨询的专家时间之外,还有许多资源。我们希望您在询问我们之前真诚地尝试学习。 “我只是有想法,没有技巧”说明你没有做过这样的尝试。

标签: c multidimensional-array structure dynamic-arrays


【解决方案1】:

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

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

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

不过,通常在堆栈上分配这么大的变量是个坏主意,所以你应该使用malloc 和朋友来分配它:

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]) {
 ...
}

【讨论】:

    【解决方案2】:
    #include <stdlib.h>
    struct samp {
            int a;
    };
    int main(void)
    {
        struct samp *(*sa)[10];
        int first_unknown = 2;
        int second_unknown = 4;
        int i,j,k;
    
        sa = malloc(sizeof(*sa) * first_unknown);
        for (i = 0; i < first_unknown; ++i) {
            for (j = 0; j < 10; ++j) {
                sa[i][j] = malloc(sizeof(*sa[i][j]) * second_unknown);
                for (k = 0; k < second_unknown; ++k)
                    sa[i][j][k].a = 12345;
            }
        }
        return 0;
    }
    

    【讨论】:

    • 对不起我的天真,但如果我们为它们分配这样的值,first_unknown 和 second_unknown 在编译时不是固定的吗?
    • @John 因此,您可以从某个地方(stdin、文件等)、从适当的 I/O 函数获取值,而不是使用硬编码的常量。
    • @John:虽然字面量 '2' 和 '4' 是常量,但 'first_unknown' 和 'second_unknown' 不是。
    猜你喜欢
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 2016-05-29
    • 2019-07-06
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    相关资源
    最近更新 更多