只是尝试(重新)学习 C 语言并努力解决一些基本概念。
我查看了这个线程:How to memset an array of bools?.
据此,看来我可以初始化一个布尔二维数组,如下所示:
size_t size = sizeof(bool[4][3]);
bool (*ary)[4] = malloc(size);
memset(ary, false, size);
我看到这段代码的问题是它取决于一个布尔值占用 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
调用慢一点。然而,始终优先考虑代码可读性而不是微优化。