2

memcpy2 つのポインタを使用してコピーする方法ab両方ともunsigned char *:

  1. aデータで満たされたメモリを指している (unsigned char)
  2. b割り当てられていません

を使用してコピーaする方法は? の 3 番目のパラメータには、 が指すメモリのサイズ (バイト単位) が必要です。入手方法は?bmemcpymemcpya

4

3 に答える 3

5
unsigned char* b = (unsigned char*)malloc(length_of_a);
memcpy(b, a, length_of_a);

もちろん、「a」の長さを取得する方法はわかりません。memcpyを知らないか、変数として持っていない場合、確実にmemcpyを呼び出すことはできません。そうしないと、memcpyを呼び出そうとする試みは本質的に安全ではありません。

あなたは本当に何をしようとしていますか?

「a」が配列ではない可能性もあります。この場合、memcpyは必要ありません。

char b = '\0';
if (a != NULL)
{
    b = *a;
}
于 2012-09-01T16:19:55.060 に答える
3

aは NUL 終端 ( で終わる) であると想定する必要があり'\0'ます。そうしないと、そのサイズ/長さについて確信が持てません (a自分自身の長さを知っている場合を除きます)。

char *a = "Hello World"; /* say for example */
size_t len = strlen(a)+1; /* get the length of a (+1 for terminating NUL ('\0') character) */

が指している (または保存されている) 文字列の長さがわかっている場合は、上記のステートメントを使用する代わりに、 にa割り当てることに注意してください。len

char *b = calloc(1, len); /* */
memcpy(b, a, len); /* now b contains copy of a */

文字列 (NUL で終了) のコピーを作成するだけの場合は、strdup()(で宣言string.h)を使用できます。

char *b = strdup(a); /* b now has a copy of a */

注:strdup()は POSIX にあります。厳密な ANSI C が必要な場合は、前述のように次のようなラッパーを作成できます。

unsigned char *my_strdup(const unsigned char *a)
{
  size_t len = strlen(a)+1;
  unsigned char *b = calloc(1, len);
  if (b) return (unsigned char *) memcpy(b, a, len);
  return NULL; /* if calloc fails */
}
于 2012-09-01T16:40:43.677 に答える
1

「a」がヌルで終了すると仮定すると、 strlenb(a) を使用してその長さを取得し、 calloc を使用して宛先ポインターにメモリを割り当て、メモしたように memcpy を使用できるはずです。

于 2012-09-01T16:15:26.257 に答える