我有以下代码:
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
我真的不知道如何克服它。
有什么想法吗?
答案 0 :(得分:2)
如果rnp.prefixlen
是整数(由类型u_int8_t
表示),那么你不能strncat
它(整数将被强制转换为指针然后解除引用,这将导致未定义的行为。)
如果您的目标是将某些格式化文字写入字符串,请改为使用sprintf
或snprintf
:
sprintf(prefix, "/%d", rnp.prefixlen);
sprintf
和snprintf
会返回写入的字符数,因此您可以轻松跟踪字符串的结尾,而不会屈服于Schlemiel the Painter's algorithm。
答案 1 :(得分:0)
strncat(prefix, rnp.prefixlen, MAX_PREFIX_LEN);
应该是
strncat(prefix, rnp.prefixlen, IPV6_PREFIX_STR_MAX_LEN-1);
由于IPV6_PREFIX_STR_MAX_LEN的大小为“prefix”,而不是MAX_PREFIX_LEN。 -1是因为你已经消耗了前一行中的1个字节。
如果 rnp.prefixlen 的类型为 u_int8_t ,则表示它不是字符串,不应使用strncat进行操作。尝试使用memcpy / memmove。