1

我正在编写一个程序来连接 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;
}
4

6 回答 6

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

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

memcpy(p + an,...
于 2012-06-12T13:23:00.827 回答
2

*sizeof(int)从 memcpy 的第一个参数中删除乘法。将其保留在mallocmemcpy 的参数和第三个参数中。

这是因为p + an指向s 右侧的an —— 即ints右侧的字节。an intpintan*sizeof(int)p

于 2012-06-12T13:20:52.777 回答
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));

于 2012-06-12T13:31:32.987 回答
0

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

于 2012-06-12T13:34:35.080 回答
0

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

于 2012-06-12T13:45:28.867 回答
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 程序在排序后合并两个数组

于 2016-12-06T14:43:28.363 回答