【问题标题】:Segmentation fault on strncatstrncat 上的分段错误
【发布时间】:2013-02-26 07:51:58
【问题描述】:

我有以下代码:

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

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

有什么想法吗?

【问题讨论】:

  • prefix 是 0 终止的吗?
  • 您确定要设置 rnp.prefixlen 吗?
  • @elcanibal ,是的,它正在其他地方使用...
  • @cnicutar ,你在考虑 memset 吗?
  • @Itzik984 这将是一个选项。 prefix[0] = 0;也是如此。

标签: c string char


【解决方案1】:

如果rnp.prefixlen 是一个整数(如u_int8_t 类型所指示的那样),那么你不能strncat 它(整数将被转换为指针,然后被取消引用,这将导致未定义的行为)。

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

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

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

【讨论】:

  • 确实如此。当标准 snprintf 提供类似(如果不是更好)功能时,我质疑使用非标准 strncat 背后的基本原理。对此 +1。
【解决方案2】:
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。

【讨论】:

    猜你喜欢
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    相关资源
    最近更新 更多