2011-11-27 15 views
15

整数配列を複製する最良の方法は何ですか? memcpy()はそれを行う方法の1つです。 strdup()のような機能はありますか?ある整数配列を別の配列にコピーする方法

+0

単純な 'for'ループ? – Shahbaz

+1

'strdup'はヌルターミネータに依存していますが、これはint配列にはありません。 'memcpy'の何が問題なの? –

+0

そうです。私はstrdup()を使って文字列に起こるようなやり方でそれをやり遂げることができるかどうかを知りたかった。 – FourOfAKind

答えて

23

ありません。また、strdupも標準ではありません。もちろん、単に自分自身を書くことができます適切に使用されている場合

int * intdup(int const * src, size_t len) 
{ 
    int * p = malloc(len * sizeof(int)); 
    memcpy(p, src, len * sizeof(int)); 
    return p; 
} 
+5

mallocがNULLを返したかどうかを確認します; – Beginner

+9

@RomanB .:読者のためのエクササイズ! :-) –

+0

もちろん私はやります。 :) – FourOfAKind

0

これは、仕事ができる:

#define arrayDup(DST,SRC,LEN) \ 
      { size_t TMPSZ = sizeof(*(SRC)) * (LEN); \ 
       if (((DST) = malloc(TMPSZ)) != NULL) \ 
       memcpy((DST), (SRC), TMPSZ); } 

次に、あなたが行うことができます:

double dsrc[4] = { 1.1, 2.2, 3.3, 4.4 }; 
int *isrc = malloc(3*sizeof(int)); 
char *cdest; 
int *idest; 
double *ddest; 
isrc[0] = 2; isrc[1] = 4; isrc[2] = 6; 

arrayDup(cdest,"Hello",6); /* duplicate a string literal */ 
arrayDup(idest,isrc,3); /* duplicate a malloc'ed array */ 
arrayDup(ddest,dsrc,4); /* duplicate a regular array */ 

の注意事項は次のとおりです。

  • SRCおよびDSTのマクロパラメータは、それが、一方よりSRCとして渡されたポインタ/配列が(正しい型にキャストしない限りvoid *)源アレイのものと一致しなければならないのタイプ

を評価しますソース配列がmalloc()であったかどうか、どの型であっても動作します。