0

次のセグメンテーション違反はなぜですか?

私は標準のc99、UNIXでのiccコンパイラを使用しています。これをセグメンテーション違反にしないようにすることはできません。その理由に興味があります。私はstrcat/strcpyにあまり詳しくありません。

char *first = "First";
char *second = "Second";
char *both = (char *)malloc(strlen(first) + strlen(second) + 2);

strcpy(both, first);
strcat(both, " ");
strcat(both, second);

sprintf("%s %s", first, second);
4

2 に答える 2

5
sprintf("%s %s", first, second);

の最初のパラメータsprintfは宛先バッファです。宛先バッファとして定数文字列を指定しました。

何かを印刷しようとしているだけの場合、それはどういう意味printfですか?

それ以外の場合、正しい使用法は次のようになります。

// declaration of "dest" left as exercise for the reader
//
sprintf(dest, "%s %s", first, second);

ただし、sprintfはに置き換えられましたsnprintf。これは、バッファオーバーフローを回避するために適しています。

于 2012-10-20T06:30:30.153 に答える
0

sprintfは、フォーマットされた文字列に印刷する「stringprintf」です。

sprintfは、書き込み先の文字列宛先ポインター(十分な長さの書き込み可能なバッファー)を想定しています。渡すのは、7バイト長の定数文字列リテラルです。そして、セグメンテーション違反の原因となっている7バイトを超えて書き込もうとしています。

char *first = "First";
char *second = "Second";
char *both = (char *)malloc(strlen(first) + strlen(second) + 2);

strcpy(both, first); // unnecessary
strcat(both, " "); // unnecessary
strcat(both, second); //unnecessary

printf(both,"%s %s\0", first, second);
于 2012-10-20T06:33:28.207 に答える