在2d数组末尾写入值

时间:2015-12-01 23:41:30

标签: c arrays

我有一个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中实现这样的结果?有可能吗?

1 个答案:

答案 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_backstd::vector::emplace_back成员函数添加到最后