gpt4 book ai didi

c - 在二维数组末尾写入值

转载 作者:太空宇宙 更新时间:2023-11-04 08:19:28 27 4
gpt4 key购买 nike

我有一个二维数组。第一维具有固定大小,我动态创建第二维。例如

    int **arr;
*arr=( int * ) malloc ( X * sizeof ( int )) // X is input from user

我想做的是创建二维并在其末尾写入值。

例如,我使用 arr[0] 创建第二个维度

arr[0]=( int * ) malloc ( 2 * sizeof ( int ))

然后我想在这个 2 维中写入值,但不知道索引。许多编程语言都有方法 array.push,它可以在不知道数组的索引或长度的情况下将项目推到数组的末尾。我怎样才能在 C 中获得这样的结果?可能吗?

最佳答案

简短的回答:不。您需要知道通过指针分配的内存的最后一个索引。 无法知道为指针分配的内存,因此您需要知道每一列的最后一个索引。对指针应用 sizeof 会得到指针占用的内存(通常是 4 或 8 个字节),不是指针分配的内存。这是指针和数组的根本区别。它们并不相同,尽管数组在作为参数传递给函数时会衰减为指针。

假设你的二维数组有 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

但是,我建议您改用一维数组(以防每一列的维度相同),并从一维映射到二维,反之亦然。这种方式更好,因为数据是连续存储的(更好的数据局部性)并且没有缓存未命中。

如果切换到 C++,则可以使用标准容器 std::vector ,它“知道”它的索引,你可以通过 std::vector::push_back 在末尾添加或 std::vector::emplace_back成员函数。

关于c - 在二维数组末尾写入值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34032384/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com