我有一个问题,即我使用memcpy()
将数组复制到具有动态内存的新数组。我的问题是为什么数字之间有3个零?就像我的原始数组是a1[] ={1, 2, 3, 4, 5}
一样,当我使用memcpy(mem1,a1,n1)
时,我的mem1将是1 0 0 0 2
?
这是我的代码:
int join_arrays(unsigned int n1, int *a1, unsigned int n2, int *a2, unsigned
int n3, int *a3)
{
/*Here I just print the original a1 just to make sure it's correct*/
for (int j = 0; j < 5; j++) {
printf("%d ", a1[j]);
}
/*I allocate the memory for the new array*/
char *mem1;
mem1 = malloc(n1*sizeof(int));
/*checking if the allocation succeeded*/
if (!mem1) {
printf("Memory allocation failed\n");
exit(-1);
}
/*Using memcpy() to copy the original array to the new one*/
memcpy(mem1, a1, n1);
/*Printing the new array and this print gives me "1 0 0 0 2"
and it should give me "1 2 3 4 5"*/
printf("\n");
for (int i = 0; i < 5; i++) {
printf("%d ", mem1[i]);
}
return 0;
}
int main(void)
{
/* these are the original arrays which I need to put together to a single array */
int a1[] = { 1, 2, 3, 4, 5 };
int a2[] = { 10, 11, 12, 13, 14, 15, 16, 17 };
int a3[] = { 20, 21, 22 };
/*The number of elements are before the array itself*/
join_arrays(5, a1, 8, a2, 3, a3);
return 0;
}
答案 0 :(得分:3)
不是分配内存并将其分配给char*
,而是使用int*
并使用它。
int *mem1;
mem1 = malloc(n1*sizeof(int)); // malloc(n1 * sizeof *mem1);
..
memcpy(mem1,a1,n1*sizeof(a1[0]));
同时检查malloc是否失败 - 但添加了正确的错误消息: -
if (!mem1) {
perror("Memory allocation failed\n");
exit(EXIT_FAILURE);
}
在你的情况下,不要忘记释放动态分配的内存
free(mem1);
正如你所说,你需要从函数中返回它然后你会做这样的事情
int *join_arrays(..){
return mem1;
}
int main(void){
int *p = join_arrays(..);
/* work with it */
free(p);
}
答案 1 :(得分:1)
mem1
这里是一个char指针而不是一个int指针。
因此,当您尝试打印mem1[i]
时,它实际上会打印存储在地址mem1+i
而不是4个字节的字节。显然整数1
就像这样存储在你的机器上:
00000001 00000000 00000000 00000000
这就是为什么你得到3个零。
尝试将变量类型更改为int*
,如下所示:
int *mem1;
mem1 = malloc(n1*sizeof(int));
memcpy(mem1,a1,n1*sizeof(int));