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

问题描述 投票:0回答:1

只是尝试(重新)学习 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(假)来初始化我的记忆,还可以用我想要的任何东西来初始化我的记忆。我测试过,这根本不起作用。

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

谢谢!

arrays c pointers
1个回答
1
投票

除了

[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
    调用慢一点。然而,始终优先考虑代码可读性而不是微优化。
© www.soinside.com 2019 - 2024. All rights reserved.