【问题标题】:How can I concatenate two arrays in C using memcpy?如何使用 memcpy 在 C 中连接两个数组?
【发布时间】:2016-12-02 16:44:40
【问题描述】:

我有 2 个带有坐标的数组,我想将它们复制到一个数组中。我使用了 2 个 for 循环及其工作,但我想知道,如果没有它们我可以做到,我不知道如何在这种情况下使用 memcpy。这是我的代码:

int *join(int *first, int *second,int num, int size) {

int *path= NULL;
int i = 0 , j = 0;

path = (int*) malloc (2*size*sizeof(int)); 

    for(i = 0 ; i < num; i++) {
        path[i * 2] = first[i * 2];
        path[i * 2 + 1] = first[i * 2 + 1];

    }

    for(i = num; i < size ; i++) { 
        path[(i*2)] = second[(j+1)*2];
        path[(i*2)+1] = second[(j+1)*2 +1];
        j++;
    }
  return path;
}

【问题讨论】:

  • 这个 path[(i*2)+1] 在最后一次迭代中写入无效内存。
  • @JonathanLeffler:第二个循环从num开始,num描述firstint对的数量,而size描述结果中对的总数(即firstsecond 中组合的对数)。我承认,变量名没有多大帮助。
  • @alk:怎么会这样?他们为2 * sizeints 分配了空间,因此有效索引从0 运行到2 * size - 1(含)。在最后一次迭代中,isize - 1,所以 i * 2 + 1(size - 1) * 2 + 1,结果是 2 * size - 1
  • @ShadowRanger:嗯...好的;是的。更有理由展示如何使用该功能。像int *new_arr = join(old_1, old_2, num_old_1, num_old_1 + num_old_2) 这样的说明性电话会告诉我们很多关于它应该如何工作的信息。

标签: c arrays loops memcpy


【解决方案1】:

只需计算要复制的正确字节数,然后从每个原点复制到正确的偏移量:

int *join(int *first, int *second, int num, int size) {
    // Compute bytes of first
    const size_t sizeof_first = sizeof(*first) * 2U * num;
    // Computes bytes of second as total size minus bytes of first
    const size_t sizeof_second = sizeof(int) * 2U * size - sizeof_first;

    int *path = malloc(sizeof(int) * 2U * size); 

    // Copy bytes of first
    memcpy(path, first, sizeof_first);
    // Copy bytes of second immediately following bytes of first
    memcpy(&path[2U * num], second, sizeof_second);
    return path;
}

【讨论】:

  • @chux:糟糕,我之前有正确的声明,但是在发布前进行编辑时,我在 copy'n'paste 错误中丢失了类型。 :-) 固定的。我还按照建议先移动了sizeofs;它与 OP 的顺序不匹配,但我没有理由不修复它。
  • 感谢大家的帮助,帮助很大
  • @chux:呵呵。我正在考虑这一点,并决定,为了确定,将所有2 文字明确地设为unsigned,我相信这将保证&amp;path[2U * num] 有效。是的,我同意适当地使用size_t 是最好的解决方案,但我对调整原型比调整内部更谨慎。
  • 同意原型调整的担忧。 2U * num 是对 2 * num 的合理改进,但不能保证防止出现较大正数 num 的计算问题。 INT_MAX == UINT_MAX 是可能的,根据 C,但可能仅适用于某些垃圾填埋场中的深奥平台。
猜你喜欢
  • 1970-01-01
  • 2010-12-14
  • 2015-04-23
  • 2021-12-28
  • 1970-01-01
  • 2019-06-07
  • 2020-08-29
  • 1970-01-01
  • 2012-09-23
相关资源
最近更新 更多