通过简单地使用指向它中间的指针来拆分C数组是不好的做法吗?

时间:2012-02-17 13:01:06

标签: c arrays pointers malloc

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

通过使用两个指针来简单地执行此操作是不好的做法,一个指向原始数组的开头而第二个指向中间?

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

5 个答案:

答案 0 :(得分:12)

如果你知道自己在做什么,我认为这不是一种不好的做法。在某些情况下,您牺牲了可读性以提高效率。如果你只是再创建两个数组,可能会更清楚,但如果你对数组和指针有一个牢固的把握,为什么要分配额外的内存呢?

答案 1 :(得分:11)

绝对不是! C语言中的整个编程点就是能够做出这些巧妙的指针技巧!

请注意,mergesort不在位,因此您仍需要malloc辅助数组。如果你做了正确的指针技巧,你可以只使用malloc一次并重复使用它。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:1)

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