如何在C中合并两个数组?

时间:2012-06-12 13:19:13

标签: c

我正在编写一个程序来连接C中的两个数组。我为第三个数组分配内存,并使用memcpy将字节从两个数组复制到第三个数组。测试输出是:

  

1 2 3 4 5 0 0 0 0 0

这种方法有什么问题吗?

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int *array_concat(const void *a, int an,
                   const void *b, int bn)
{
  int *p = malloc(sizeof(int) * (an + bn));
  memcpy(p, a, an*sizeof(int));
  memcpy(p + an*sizeof(int), b, bn*sizeof(int));
  return p;
}

// testing
const int a[] = { 1, 2, 3, 4, 5 };
const int b[] = { 6, 7, 8, 9, 0 };

int main(void)
{
  unsigned int i;

  int *c = array_concat(a, 5, b, 5);

  for(i = 0; i < 10; i++)
    printf("%d\n", c[i]);

  free(c);
  return 0;
}

6 个答案:

答案 0 :(得分:4)

memcpy(p + an*sizeof(int),...

这第二个memcpy,您正在尝试将5 * sizeof(int)添加到int指针p。但是,当您添加到指针时,它已经知道它必须处理sizeof(type),因此您不必告诉它。

memcpy(p + an,...

答案 1 :(得分:2)

从memcpy的第一个参数中删除乘法*sizeof(int)。将它保存在malloc的参数和memcpy的第3个参数中。

这是因为p + an指的是来自int的{​​{1}} an int的{​​{1}},即pint到右边是an*sizeof(int)个字节。

答案 2 :(得分:1)

p是指向int的指针。向指向int的指针添加整数时,编译器将整数乘以整数的大小。最终结果是乘以整数两次的大小:你得到的是“p + an * sizeof(int)”是p +(a中元素的数量)*(数字) int中的字节数*(int中的字节数)。

memcpy(p + an * sizeof(int),b,bn * sizeof(int));

应该是:

memcpy(p + an,b,bn * sizeof(int));

答案 3 :(得分:0)

您应该从使用指针算术(+)的第二个memcpy中删除sizeof(int)。 编译器根据指针的类型自行完成。

答案 4 :(得分:0)

你应该看到memcpy的定义,从src复制到dst区域的n个“字节”。所以,你只需要为第三个参数设置sizeof(int)的次数。对于“c”,它是int类型的指针,因此,它确实知道“+ an”表示将p向前移动到+ 1 int位置。

答案 5 :(得分:0)

合并可以通过对要合并代码的元素元素进行排序来合并两个数组

#include<stdio.h>
void sort(int arr[],int size){  // sorting function
    int i,j,temp;
    for(i=0;i<size;i++){
        for(j=i;j<size;j++){
            if(arr[i]>arr[j]){
                temp = arr[i];
                arr[i] = arr[j];
                arr[j] =  temp;
            }
        }
    }
}
int main(){
    int a[10],b[10],c[10];
    int n,i,k=0,j=0;
    printf("Enter the size of the array:");
    scanf("%d",&n);
    for(i=0;i<n;i++){
        printf("Enter the element of array A at index %d:",i); //input array A
        scanf("%d",&a[i]);
    }
    sort(a,n);
    for(i=0;i<n;i++){
        printf("Enter the element of array B at index %d:",i);  //Input array B
        scanf("%d",&b[i]);
    }
    sort(b,n);
    for(i=0;i<(n+n);i++){   // merging the two arrays
        if(a[k]<b[j]){
            c[i] = a[k];
            k++;
        }
        else{
            c[i] = b[j];
            j++;
        }
    }
    printf("Merged Array :\n");
    for(i=0;i<(n+n);i++){
        printf("c -> %d ",c[i]);
    }
    return 0;
}

参考C program to Merge Two Arrays after Sorting