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(整数はポインターにキャストされてから逆参照されるため、未定義の動作が発生します)。

フォーマットされたテキストを文字列に書き込むことが目的の場合は、代わりにsprintforを使用します。snprintf

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

sprintfsnprintf書き込まれた文字数を返すので、画家のシュレミエルのアルゴリズムに屈することなく、文字列の末尾を簡単に追跡できます

于 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 に答える