これを 1 つずつ実行してみましょう。
struct test *t1 = malloc(sizeof(struct test));
これにより、にスペースが割り当てられstruct test
ます。ポインタには十分なスペースがありますが、ポインタが指すname
メモリはありません。少なくとも、次のことを行う必要があります。
t1->name = malloc(strlen(s) + 1);
それが完了したら、文字列のコピーに進むことができます。ただし、メモリを割り当てるために文字列の長さを 1 回計算しています。を呼び出して暗黙的に再度実行しても意味がありませんstrncpy
。代わりに、次の操作を行います。
const size_t len = strlen(s) + 1; // +1 accounts for terminating NUL
t1->name = malloc(len);
memcpy(t1->name, s, len);
一般に、この基本的なパターンを使用してみてください。文字列の長さは、コードに入ったときに一度計算しますがmem*
、暗黙的な長さの文字列の代わりに、明示的なサイズのメモリ バッファーと操作を使用しstr*
ます。適切に実行すれば、少なくとも同じくらい安全で(多くの場合、より安全です)、より効率的です。
strncpy
if was a fixed-size array を代わりに使用することもできますt1->name
(ただし、多くの人は を使用することを好みますstrlcpy
)。それは次のようになります。
struct test { char name[MAXSIZE]; };
struct test *t1 = malloc(sizeof *t1);
strncpy(t1->name, s, MAXSIZE - 1);
t1->name[MAXSIZE-1] = 0; // force NUL-termination
size
への引数は、宛先バッファの境界外への書き込みを避けるために、常にソースではなく宛先strncpy
のサイズである必要があることに注意してください。