1

Cで2つの配列を連結するプログラムを作成していました。3番目の配列にメモリを割り当てmemcpy、2つの配列から3番目の配列にバイトをコピーするために使用しています。テスト出力は次のとおりです。

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),...

この2番目のmemcpyは5 * sizeof(int)、intポインターに追加しようとしていますp。ただし、ポインタに追加するときは、それが処理する必要があることをすでに認識しているsizeof(type)ので、それを伝える必要はありません。

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

*sizeof(int)memcpyの最初の引数から乗算を削除します。mallocmemcpyの引数と3番目の引数に入れておきます。

これは、 -から右にsである、つまり、から右にバイトであるをp + an指しているためです。intan intpintan*sizeof(int)p

于 2012-06-12T13:20:52.777 に答える
1

pはintへのポインタです。intへのポインタに整数を追加すると、コンパイラは整数に整数のサイズを乗算します。最終的な結果は、整数のサイズを2倍することです。取得するのは「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の定義が表示されます。これは、srcからdst領域にn"バイト"をコピーします。したがって、3番目の引数に対してのみsizeof(int)の時間を掛ける必要があります。「c」の場合、これはint型のポインターであるため、「+an」はpをan+1int位置に進めることを意味します。

于 2012-06-12T13:45:28.867 に答える
0

ポインタ演算(+)を使用する2番目のmemcpyからsizeof(int)を削除する必要があります。ポインタの種類に応じて、コンパイラが単独でこれを実行します。

于 2012-06-12T13:34:35.080 に答える
0

マージは、マージされる要素の要素を並べ替えることによって実行できます。2つの配列をマージするためのコード

#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;
}

ソート後に2つの配列をマージするためのCプログラムを参照

于 2016-12-06T14:43:28.363 に答える