0

我有以下代码:

struct prefix rnp;
char prefix[IPV6_PREFIX_STR_MAX_LEN];

...

strncat(prefix, "/", 1);  <----- WORKS OK
strncat(prefix, rnp.prefixlen, MAX_PREFIX_LEN); <------ SEG FAULT

...

rnp.prefixlen 类型在哪里u_int8_t

IPV6_PREFIX_STR_MAX_LEN = 45

MAX_PREFIX_LEN = 2

的内容prefix是 192.13.6.0 和的rnp.prefixlen是 16

我真的不知道如何克服它。

有任何想法吗?

4

2 回答 2

2

如果rnp.prefixlen整数(如 type 所示u_int8_t),那么您不能strncat使用它(整数将被强制转换为指针,然后被取消引用,这将导致未定义的行为)。

如果您的目标是将一些格式化文本写入字符串,请使用sprintforsnprintf代替:

sprintf(prefix, "/%d", rnp.prefixlen);

sprintfsnprintf返回写入的字符数,因此您可以轻松跟踪字符串的结尾,而不会屈服于Schlemiel the Painter 的算法

于 2013-02-26T08:10:24.793 回答
0
strncat(prefix, rnp.prefixlen, MAX_PREFIX_LEN);

应该

strncat(prefix, rnp.prefixlen, IPV6_PREFIX_STR_MAX_LEN-1);

由于 IPV6_PREFIX_STR_MAX_LEN 是“前缀”的大小,而不是 MAX_PREFIX_LEN。-1 是因为您已经在上一行中消耗了 1 个字节。

此外,如果rnp.prefixlenu_int8_t类型,这意味着它不是字符串,不应使用 strncat 操作。尝试改用 memcpy/memmove。

于 2013-02-26T08:05:29.917 回答