strncat上的分段错误

时间:2013-02-26 07:51:59

标签: c string char

我有以下代码:

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

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

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

如果rnp.prefixlen整数(由类型u_int8_t表示),那么你不能strncat它(整数将被强制转换为指针然后解除引用,这将导致未定义的行为。)

如果您的目标是将某些格式化文字写入字符串,请改为使用sprintfsnprintf

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

sprintfsnprintf会返回写入的字符数,因此您可以轻松跟踪字符串的结尾,而不会屈服于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。