在C语言中连接两个整数数组。

问题描述 投票:1回答:1

我正在尝试连接两个整数组。这个方法对于字符串(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 arrays integer concat memcpy
1个回答
2
投票

忘掉所有关于变量大小的硬编码。那是你问题的根源,会让代码变得很脆弱。

不过这里的具体问题是 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)),这也是可以的,这是一个编码风格偏好的问题。


0
投票

由于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

0
投票

你必须更换 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.