1

'\0'この関数が2 番目の引数としてコンパイルしてクラッシュする理由を教えてください。

char var[9];
/*some initialization of var */
strcat(var, '\0');
4

3 に答える 3

4

その関数はconst char *、2 番目のパラメーターとして a を取ります。を渡していintます。

char *strcat(char *restrict s1, const char *restrict s2);

基本的に、ポインターとしてstrcat逆参照するようにだましています-それは逆参照します。\0NULL

于 2012-02-24T10:07:50.710 に答える
1

の 2 番目の引数は、null で終わる文字配列への ポインターstrcatである必要があります。あなたのコードはコンパイルさえすべきではありませんが、もしそうなら、結果はundefined behaviorになります。

于 2012-02-24T10:08:13.033 に答える
0

コメントが次の行を説明することを意図している場合(省略されている実際の初期化のプレースホルダーとして機能するのではなく)、2番目のシナリオがあります。

連結を開始する場所を見つけるためstrcat()に最初の引数の終わりを見つける必要があり、初期化されていない文字配列を渡す必要があるため、最初の文字列の終了文字を探している間、有効なメモリの外に出る可能性があります。一部のプラットフォームでは、有効なメモリの外部で読み取るとクラッシュが発生する可能性があります。

したがって、2番目の引数は、それが壊れた理由とは関係がない可能性がありますが、もちろんそれも間違っています。

于 2012-02-24T10:13:16.553 に答える