我正在尝试在编译时创建一个2d数组,它具有未知的行数,我可以在整个程序中动态分配,但是特定数量的列为8。
像----> Elements [?] [8];
之类的东西答案 0 :(得分:3)
如果必须使用2d数组而不是数组列表,则必须使用数组
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
答案 1 :(得分: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));
其余的是直截了当的。您可以将table[i][j]
的元素引用为0..rows-1中的i
和0..7中的j
。请记住在完成后释放您的分配:
free(table);
并且不要再次引用它。
答案 2 :(得分:1)
当尺寸未知时,我会采用这种方法 假设数据类型为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]
答案 3 :(得分:1)
据我所知,您在foo[][8]
中无法C
。您可以通过创建一个结构并将指向该结构的指针强制转换为数组来解决它,如here所述,但这是一个有点脆弱的黑客。
您可以做的是更改问题空间中行和列的定义,这样,为了访问行i
,列j
,您可以改为foo[j][i]
foo[i][j]
。
在这种情况下,您可以像这样声明您的数组:<typename> * foo[8]
。
答案 4 :(得分:0)
我认为在编译时没有传递任何值时不会创建它,我的建议是使用dynamic memory allocation
,因为你不知道有多少行