memcpy
2 つのポインタを使用してコピーする方法a
、b
両方ともunsigned char *
:
a
データで満たされたメモリを指している (unsigned char)b
割り当てられていません
を使用してコピーa
する方法は? の 3 番目のパラメータには、 が指すメモリのサイズ (バイト単位) が必要です。入手方法は?b
memcpy
memcpy
a
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;
}
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 */
}
「a」がヌルで終了すると仮定すると、 strlenb(a) を使用してその長さを取得し、 calloc を使用して宛先ポインターにメモリを割り当て、メモしたように memcpy を使用できるはずです。