只是尝试(重新)学习 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/