让我们一步一步来:
struct test *t1 = malloc(sizeof(struct test));
这为 a 分配空间struct test
;指针有足够的空间,但没有指针指向name
的任何内存。至少,您需要执行以下操作:
t1->name = malloc(strlen(s) + 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
ift1->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
参数 tostrncpy
应该始终是目标的大小,而不是源的大小,以避免写入目标缓冲区的范围之外。