【问题标题】:Is it bad practice to split a C array by simply using a pointer to the middle of it?仅使用指向 C 数组中间的指针来拆分 C 数组是不好的做法吗?
【发布时间】:2012-03-08 21:04:41
【问题描述】:

我正在 c 中实现一个合并排序版本。第一步,我必须将数组拆分为子数组。

简单地通过两个指针来做这件事是不好的做法,一个指向原始数组的开头,第二个指向中间?

或者我应该 malloc 2 个新的内存槽,在此处复制适当的值,然后保留指向该空间的指针?

【问题讨论】:

    标签: c arrays pointers malloc


    【解决方案1】:

    如果您知道自己在做什么,我认为这不是坏习惯。在某些情况下,您会为了效率而牺牲可读性。如果你再创建两个数组可能会更清楚,但如果你牢牢掌握数组和指针,为什么要分配额外的内存?

    【讨论】:

    • 另一方面,如果你不知道自己在做什么,在 C 中做任何事情都是不好的做法。
    • @WilliamPursell :) 除非您使用不带可变参数的 printf。那很容易。
    • @LuchianGrigore,你的意思是printf("%s\n");
    • @LuchianGrigore,我知道你说printf 没有可变参数是你可以做对的,即使你不知道你在做什么。所以我举了一个反例。
    【解决方案2】:

    绝对不是!用 C 语言编程的重点在于能够完成这些巧妙的指针技巧!

    但请注意,mergesort 不是就地排序,因此您仍需要 malloc 一个辅助数组。如果你做了正确的指针技巧,你可以只 malloc 一次并重用它。

    【讨论】:

      【解决方案3】:

      在这种情况下使用一个数组就好了(如合并排序)。调用 malloc 是不必要的,除非数组的大小对于堆栈来说太大。

      【讨论】:

        【解决方案4】:

        通常使用合并排序,您希望将合并的结果放入原始输入占用的内存中。如果是这样,那么您应该:

        • 对两半进行排序
        • 将数组的“下”半部分复制到新分配的缓冲区中,将“上”半部分留在原处
        • 从“上”半部分和额外的缓冲区合并到大数组的“底部”。

        这样,您只需要分配与输入大小一半一样多的额外内存。您甚至可以在开始时执行一次,然后将相同的缓冲区用作您将要执行的所有合并的工作空间。

        【讨论】:

          【解决方案5】:

          不,这还不错,事实上,我认为这是首先使用 C 的唯一原因之一。如果每次需要对相同数据进行略微不同的处理时,您都要制作数据的浪费副本,那么您已经调用了高级脚本语言的最大成本之一。您还大大增加了代码必须执行的错误处理量(因为分配可能会失败),并且由于 C 中的错误处理往往有点“冗长”(善意地说),因此净复杂性成本要差得多而不是就地访问子数组的轻微复杂性成本。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-11-06
            • 1970-01-01
            • 1970-01-01
            • 2023-03-18
            • 2017-08-25
            • 2018-01-04
            • 1970-01-01
            相关资源
            最近更新 更多