【发布时间】:2014-03-13 05:04:29
【问题描述】:
我试图在编译时创建一个二维数组,它有一个未知的行数,我可以在整个程序中动态分配,但特定的列数为 8。
类似---->Elements[?][8];
【问题讨论】:
-
感谢您提供的所有解决方案,我将在明天尝试实施其中的一些,看看哪个最适合我的应用程序,然后选择最佳答案。谢谢!
标签: c arrays dynamic multidimensional-array
我试图在编译时创建一个二维数组,它有一个未知的行数,我可以在整个程序中动态分配,但特定的列数为 8。
类似---->Elements[?][8];
【问题讨论】:
标签: c arrays dynamic multidimensional-array
如果你必须使用二维数组而不是数组列表,你将不得不创建一个数组
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
【讨论】:
知道列数并仅使行数动态化,您可以使用 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);
并且不要再次引用它。
【讨论】:
据我所知,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])。
当尺寸未知时,我会采用这种方法。
假设数据类型为 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]
【讨论】:
我认为当你在编译时没有传递任何值时它不会被创建,我的建议是使用dynamic memory allocation 因为你不知道有多少行
【讨论】: