【问题标题】:How to implement a dynamic 2D array in C with known number colums如何在 C 中实现具有已知数列的动态二维数组
【发布时间】:2014-03-13 05:04:29
【问题描述】:

我试图在编译时创建一个二维数组,它有一个未知的行数,我可以在整个程序中动态分配,但特定的列数为 8。

类似---->Elements[?][8];

【问题讨论】:

  • 感谢您提供的所有解决方案,我将在明天尝试实施其中的一些,看看哪个最适合我的应用程序,然后选择最佳答案。谢谢!

标签: c arrays dynamic multidimensional-array


【解决方案1】:

如果你必须使用二维数组而不是数组列表,你将不得不创建一个数组

constant i = 1
foo[i][8]

每次你想扩展该数组时

make temp_foo[i][8]
copy foo to temp_foo
delete foo
make foo[i++][8]
copy temp_foo to foo

但这让人感到困惑。我认为如果使用链接列表会更好

struct node
{
 foo[8]
 node *next;
}

添加第一个元素

node *element_head
element->foo = {add elements}
element->next = null

添加新元素

node *temp
temp->foo = {add element}
temp->next = element_head
element_head= temp

【讨论】:

    【解决方案2】:

    知道列数并仅使行数动态化,您可以使用 VLA 或动态分配。 VLA 是直截了当的:

    int rows;
    
    // get rows somehow
    
    int table[rows][8];
    

    请记住,VLA 具有自动存储生命周期,并且一旦封闭范围到期就会从可寻址内存中删除。而且它们不能是全局变量。

    如果您的实现不支持 VLA,自动存储空间是一个问题,或者您需要一个全局变量用于某些邪恶的目的,您将不得不动态地管理它(听起来您无论如何都想这样做)。为此,请声明一个指向 8 个元素的数组的指针,如下所示:

    int rows;
    
    // get rows somehow
    
    int (*table)[8] = malloc(rows * sizeof(*table));
    

    其余的都是直截了当的。对于 0..rows-1 中的 i 和 0..7 中的 j,您可以将元素引用为 table[i][j]。请记住在完成后释放您的分配:

    free(table);
    

    并且不要再次引用它。

    【讨论】:

    • 经过仔细考虑,这种方法最适合我的程序的需要。谢谢大家的回答!
    【解决方案3】:

    据我所知,foo[][8] 不能包含在 C 中。正如here 所讨论的那样,您可以通过创建一个结构并将指向该结构的指针转换为一个数组来绕过它,但这是一个有点脆弱的hack。

    您可以做的是更改问题空间中行和列的定义,这样,为了访问行i、列j,您可以使用foo[j][i] 而不是foo[i][j]。 在这种情况下,您可以像这样声明您的数组:<typename> * foo[8]。

    【讨论】:

    • 您可以拥有它,尽管语法与您在此处显示的不同。它是type (*foo)[8]; 此外,said-variable 作为函数参数传递是有效的,声明为:void func(type ar[][8])。
    • 嗯,我确实说过“据我所知”。我很高兴通过发布此答案学到了一些东西。 :)
    【解决方案4】:

    当尺寸未知时,我会采用这种方法。
    假设数据类型为 int。

    int* a; //this will point to your 2D array
    

    当你知道维度(ROW,COL)时分配它:

    a = malloc(sizeof(int)*ROW*COL);
    

    并像访问它一样

    a[ROW*i + j] = value  // equivalent of a[i][j]
    

    【讨论】:

    • 哦,这很整洁
    【解决方案5】:

    我认为当你在编译时没有传递任何值时它不会被创建,我的建议是使用dynamic memory allocation 因为你不知道有多少行

    【讨论】:

      猜你喜欢
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多