【问题标题】:How can I concatenate two arrays in C?如何在 C 中连接两个数组?
【发布时间】:2010-12-14 08:13:05
【问题描述】:

如何连接两个数组以获得包含两个原始数组元素的单个数组?

【问题讨论】:

  • 是的...由于这两个答案似乎都是对“串联”解释的回应,并且 OP 没有返回澄清,我已经编辑了问题以反映这一点。

标签: c algorithm arrays concatenation


【解决方案1】:

C 中的数组只是一个连续的内存区域,带有指向它们的 start* 的指针。所以合并它们涉及:

  1. 求数组 A 和 B 的长度(您可能需要知道元素的数量和每个元素的 sizeof
  2. 分配 (malloc) 大小为 A + B 的新数组 C。
  3. 将内存从 A 复制 (memcpy) 到 C,
  4. 将内存从 B 复制到 C + A 的长度(参见 1)。
  5. 您可能还想取消分配 (free) A 和 B 的内存。

请注意,这是一项昂贵的操作,但这是基本理论。如果您使用提供一些抽象的库,您可能会更好。如果 A 和 B 比简单数组(例如排序数组)更复杂,则您需要在步骤 3 和 4 之后进行更智能的复制(请参阅:how do i merge two arrays having different values into one array)。


  • 虽然对于这个问题,指针解释就足够了,严格来说(并且为了安抚下面的评论者):C 数组的概念,可以在没有语法的情况下使用的指针。然而,在实现方面,C 数组和具有指针的连续内存区域足够接近,它们可以而且经常可以互换使用。

【讨论】:

  • “...带有指向他们开始的指针...”从何而来?当我声明 int a[10] 时,我得到一个连续的内存区域,其中包含 10 个 int 并且没有任何指针。
  • @AndreyT:a 是你的指针。您似乎在对其他答案的评论中意识到了这一点......
  • @Shog9: a 不是指针。 a 是一个数组。当数组类型衰减为指针类型时,结果指针只是一个中间临时值,与a无关。 Wnat 上面的帖子是不正确的,除非它专门讨论 malloced 数组。
  • 有点迂腐,嗯?就所描述的算法而言,它没有任何区别(除了在基于堆栈的数组的情况下需要跳过第 5 步)。
  • 声明数组不是指针是甚至远程迂腐。这是一个相当流行且令人讨厌的误解,因此在这里宣传它绝对不是一个好主意。
猜你喜欢
  • 2015-04-23
  • 1970-01-01
  • 2019-06-07
  • 1970-01-01
  • 2020-08-29
  • 2012-09-23
  • 2010-09-09
  • 2020-02-24
相关资源
最近更新 更多