ポインタが指すもの(この場合はNULL)を満たす関数に渡す前に、そのポインタにメモリを割り当てる必要があります。
例:
char *str = malloc(128);
if (str)
{
str_cpy(&str, "String");
free(str);
str = NULL;
}
ターゲットバッファのサイズ情報も提供せずにこれを行わないことをお勧めします(つまり、独自に作成している場合は、ターゲットバッファの境界を確認してください。そうしないと、バージョンに同じセキュリティ上の欠陥があり、strcpy()
それが十分に悪いものになります)。
注:ターゲットとして渡されたポインターが保持するアドレスを変更する予定がない限り、ダブルポインターも使用する必要はありません。strcpy()
あなたが持っているダブルポインターの使用法は、次のような従来の使用パターンを防ぎます。
char str[128];
str_cpy(&str, "Hello"); // error.
配列アドレスをポインターからポインターとして渡すことはできないため、コードは中間ポインターなしで静的配列を埋めることはできません。
char str[128];
char *p = str;
str_cpy(&p, "Hello"); //ok. passing address of pointer.
strdup()
これが意図的でない場合(そして、NULLポインターのパッセージを内部的にエミュレートするという考えがない限り、なぜそうなるのかわかりません)、これに対処する必要があります。