arrays - 初始化动态分配的 bool 二维数组的最佳方法是什么?

标签 arrays c pointers

只是尝试(重新)学习 C 并努力解决一些基本概念。

我看过这个帖子:How to memset an array of bools? .

据此,我似乎可以初始化一个 bool 二维数组,如下所示:

size_t size = sizeof(bool[4][3]);
bool (*ary)[4] = malloc(size);
memset(ary, false, size);

我看到这段代码的问题是它取决于一个 bool 值占用 1 个字节,我认为这取决于实现。除此之外,根据我的手册页(linux manpages 项目),memset 的第二个参数似乎是一个 int...该手册页说“memset() 函数填充 s 指向的内存区域的前 n 个字节与常量字节 c"。这不是矛盾吗?如果 c 是 int 那么它不是一个字节长。

EDIT1:请参阅下面关于最后一段的 Ouroborus 评论。

经过一番思考,我想出了以下代码:

size_t size = sizeof(bool[4][3]);
bool (*ary)[4] = malloc(size);
const bool orig[4][3] = {
    {true, false, false},
    {false, true, true},
    {true, true, true},
    {false, false, false}
};
memcpy(ary, &orig, size);

这样我不仅可以用 0(假)来初始化我的内存,还可以用我想要的任何东西来初始化我的内存。我测试过,这根本不起作用。

所以我的问题是:我的代码有什么问题?更重要的是,如何做到这一点?

谢谢!

最佳答案

除了 [4] ,你的代码没有任何问题。不过我建议使用这个:

bool (*ary)[3] = calloc(1, sizeof(bool[4][3]));
...
free(ary);

完成。一些注意事项:

  • 请注意 [3] ,而不是 4。这是一个指向 bool [3] 的数组指针数组。我们使用这个的原因是 bool (*ary)[4][3]是因为如果我们放弃一个维度 - 它始终必须是最左边的维度 - 我们可以使用方便的 arr[i][j]语法,比 (*ary)[i][j] 更具可读性.
  • 请注意calloc作为分配过程的一部分,会将整个数组清零。这几乎是 calloc 的唯一原因首先存在。
  • 如果您需要将数组初始化为 false 以外的值那么确实使用 malloc + memcpy 。但这可能会比一个 calloc 慢一点点称呼。但是,始终优先考虑代码可读性而不是微优化。

关于arrays - 初始化动态分配的 bool 二维数组的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76873587/

相关文章:

javascript - 使用 jquery 花式逗号脚本时,数组不返回超过 1,000,000 的默认值

java - Java "Code too large"编译错误

javascript - 为什么我的数组过滤器返回 'undefined is not a function' ?

c - 使用指针从循环数组中弹出

c++ - C++中的指针与汇编语言中的指针之间的区别?

javascript - 从数组中获取最大且唯一的数字

c++ - OpenGL 纹理导致内存问题

c - Windows 和 Unix 的文件分隔符

c++ - std::reference_wrapper 和简单指针有什么区别?

c - C语言扑克程序