我正在尝试连接两个整数组。这个方法对于字符串(char*)很有效,但是对于整数组来说,第二个数组的内容会被改变。
int main() {
int* a = malloc(8); // 2 integers
int* b = malloc(12); // 3 integers
a[0] = 1;
a[1] = 2;
b[0] = 3;
b[1] = 4;
b[2] = 5;
int* c = malloc(20); // 5 integers
memcpy(c, a, 8);
memcpy(c+8, b, 12);
printf("%d\n", c[0]); // Excpected 1. Prints 1.
printf("%d\n", c[1]); // Excpected 2. Prints 2.
printf("%d\n", c[2]); // Excpected 3. Prints something random.
printf("%d\n", c[3]); // Excpected 4. Prints something random.
printf("%d\n", c[4]); // Excpected 5. Prints something random.
return 0;
}
忘掉所有关于变量大小的硬编码。那是你问题的根源,会让代码变得很脆弱。
不过这里的具体问题是 c+8
做指针运算 关于 int*
. 所以,它的意思是 "去8"。int
从c向前"。不 8个字节--它相当于 &c[8]
这显然是错误的。
你应该根据这个重写你的代码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
int* a = malloc(2*sizeof(int));
int* b = malloc(3*sizeof(int));
a[0] = 1;
a[1] = 2;
b[0] = 3;
b[1] = 4;
b[2] = 5;
int* c = malloc(5*sizeof(int));
memcpy(c, a, 2*sizeof(int));
memcpy(c+2, b, 3*sizeof(int));
printf("%d\n", c[0]);
printf("%d\n", c[1]);
printf("%d\n", c[2]);
printf("%d\n", c[3]);
printf("%d\n", c[4]);
return 0;
}
一个可选的malloc语法是: int* a = malloc(2 * sizeof(*a))
,这也是可以的,这是一个编码风格偏好的问题。
由于memcpy这个调用中的指针运算
memcpy(c+8, b, 12);
指定了一个不正确的目标地址。
你为5个元素分配了一个数组(只要sizeof( int )等于4)。
int* c = malloc(20)
所以,由于指针运算 c + 0
是第一个元素的地址。c + 1
是第二个元素的地址。c + 2
是第三个元素的地址,以此类推。
由于你试图从第三个元素开始填充数组,那么你必须写下
memcpy(c+2, b, 12);
^^^^
这就好比是写
memcpy( &c[2], b, 12);
也不要使用12或20这样的神奇数字。考虑到sizeof( int )是实现定义的。所以最好是写成例如
int* c = malloc( 5 * sizeof( int ) );
或
memcpy( c + 2, b, 3 * sizeof( int ) ;
你的程序可以是下面的样子。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main( void )
{
size_t n1 = 2;
size_t n2 = 3;
int *a = malloc( n1 * sizeof( int ) );
int *b = malloc( n2 * sizeof( int ) );
int init_value = 1;
for ( size_t i = 0; i < n1; i++ )
{
a[i] = init_value++;
}
for ( size_t i = 0; i < n2; i++ )
{
b[i] = init_value++;
}
size_t n3 = n1 + n2;
int *c = malloc( n3 * sizeof( int ) );
memcpy( c, a, n1 * sizeof( int ) );
memcpy( c + n1, b, n2 * sizeof( int ) );
for ( size_t i = 0; i < n3; i++ )
{
printf("c[%zu]: %d\n", i, c[i] );
}
putchar( '\n' );
free( c );
free( b );
free( a );
return 0;
}
程序的输出是
c[0]: 1
c[1]: 2
c[2]: 3
c[3]: 4
c[4]: 5
你必须更换 memcpy(c+8, b, 12);
到 memcpy(c+2, b, 12);
因为memcpy函数的第一个参数是平均数。指向要复制内容的目标数组的指针,类型转换为void类型的指针。.*
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int* a = malloc(8); // 2 integers
int* b = malloc(12); // 3 integers
a[0] = 1;
a[1] = 2;
b[0] = 3;
b[1] = 4;
b[2] = 5;
int* c = malloc(20); // 5 integers
memcpy(c, a, 8);
memcpy(c+2, b, 12);//
printf("%d\n", c[0]); // Excpected 1. Prints 1.
printf("%d\n", c[1]); // Excpected 2. Prints 2.
printf("%d\n", c[2]); // Excpected 3. Prints something random.
printf("%d\n", c[3]); // Excpected 4. Prints something random.
printf("%d\n", c[4]); // Excpected 5. Prints something random.
return 0;
}