我正在编写一个程序来连接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;
}
答案 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}},即p
从int
到右边是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;
}