• ベストアンサー

C言語のmemcpy関数について質問します。

C言語のmemcpy関数について質問します。 以下のプログラムを作成して実行したのですが期待した動作が行えません。 どなたか原因が分かる方がいましたらアドバイスいただければと思います。 (期待する動作) STR_Bに"aaaa"を格納したい (現在の動作) STR_Bに"aaaabbbb"が格納される。 (printfで"aaaabbbb"が表示される) (以下プログラムです) char *STR_A = "aaaabbbb"; char *STR_B; /* 初期化 */ memset(&STR_B,0x00,sizeof(STR_B)); /* 文字列コピー */ memcpy(&STR_B,&STR_A,4); /* コピーした文字の表示 */ printf("STR_B = %s\n",STR_B);

質問者が選んだベストアンサー

  • ベストアンサー
  • BLK314
  • ベストアンサー率55% (84/152)
回答No.4

例えば、こんな感じです。 char *STR_A = "aaaabbbb"; char STR_B[128]; /* 初期化 */ /* 0と書いても良いが、'\0'の方が終端という意味がはっきりします */ /* 結果的には’\0'は0と評価されるので同じことなのですが・・・・・ */ memset(STR_B,'\0',sizeof(STR_B)); /* 文字列コピー */ strncpyn(STR_B, STR_A, 4);

その他の回答 (4)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

根本的におかしいですね。 &STR_Aや&STR_Bとすると、それはchar**型になってしまいます。 ですので、ポインタが4バイトであれば、 > /* 文字列コピー */ > memcpy(&STR_B,&STR_A,4); の部分は、STR_B = STR_A; と同じ意味になります。 なお、ポインタが4バイトでない場合、中途半端にコピーされるか不正な領域を読み書きするため、何が起きてもおかしくない危険な状況になります。 > /* 初期化 */ > memset(&STR_B,0x00,sizeof(STR_B)); この部分は不要です。 そして、STR_Bを何らかの方法で初期化しなければなりません。 例えば、 char buffer[4+ 1]; char *STR_B = buffer; のようにします。 その上で、 sprintf(STR_B, "%.4s", STR_A); または memcpy(STR_B, STR_A, 4); STR_B[4] = '\0'; としてやればOKです。

  • anicicle
  • ベストアンサー率36% (129/356)
回答No.3

提示ソースは、「文字列のコピー」ではありません。 STR_A、STR_Bはポインタであり、格納される内容は「アドレス」です。 STR_Bに対してSTR_Aを「コピー」するのであれば、 予めSTR_Bに対して、malloc等でメモリを確保し割り当てておく必要があります。 領域を確保しない状態でコピーを行った場合はメモリ空間の破壊につながります。 (その意味ではmemsetも使い方は違う)

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.2

>変数の定義がポインタじゃ駄目(実際のデータ格納するよう意気を定義してください) 変数の定義がポインタじゃ駄目(実際のデータ格納する領域を定義してください)

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.1

変数の定義がポインタじゃ駄目(実際のデータ格納するよう意気を定義してください) memsetやmemcopyで &STR_* としてるけど & 要りません コード的にたまたま動いてるだけです (STR_B=STR_Aと書いてるのと等価になってるだけ)