我有一个2d数组。第一维具有固定的尺寸,我动态地创建第二维。例如
int **arr;
*arr=( int * ) malloc ( X * sizeof ( int )) // X is input from user
我想要做的是创建第二个维度并在其末尾写入值。
例如,我使用
为arr [0]创建第二个维度arr[0]=( int * ) malloc ( 2 * sizeof ( int ))
然后我想在第二维中写入值,但不知道索引。许多编程语言都有方法array.push
,它在数组末尾推送项而不知道数组的索引或长度。我怎样才能在C中实现这样的结果?有可能吗?
答案 0 :(得分:2)
简短回答:不。您需要知道通过指针分配的内存的最后一个索引。 无法知道为指针分配的内存,因此您需要知道每列的最后一个索引。在指针上应用sizeof
可以获得指针占用的内存(通常为4或8个字节),不是指针分配的内存。这是指针和数组之间的根本区别。它们不一样,虽然数组在作为函数的参数传递时会衰减为指针。
假设你的2D阵列有NROWS和NCOLS,你需要的是:
arr = malloc(NROWS * sizeof(int*)); // allocate memory for first dim, i.e. for rows
然后为每一行分配内存,例如对于第5行:
arr[5] = malloc(NCOLS * sizeof(int)); // allocate NCOLS for the 5-th row
通常,您在循环中为第二维分配内存:
for(size_t i = 0 ; i < NCOLS; ++i)
free(arr[i]);
然后不要忘记以相反的顺序释放内存:
for(size_t i = 0; i < NCOLS; ++i)
free(arr[i]); // release memory for cols
free(arr); // release memory for rows
但是,我建议您使用1D数组(如果每列的尺寸相同),并从1D映射到2D,反之亦然。这种方式更好,因为数据是连续存储的(更好的数据局部性)并且没有缓存未命中。
如果切换到C ++,那么您可以使用“知道”其索引的标准容器std::vector
,并且可以通过std::vector::push_back
或std::vector::emplace_back
成员函数添加到最后