3

私はこの単純な C プログラムを書きましたが、strcat のこの奇妙な振る舞いを完全には理解できませんでした。

long sum(long col, char* path, char* path2){

    printf("%s\n",path2);
    strcat(path,".endlines");
    printf("%s\n",path2);
    return 0;
}

int main(int argc, char* argv[]) {
    int n=atoi(argv[1]);
    sum(n,argv[2],argv[3]);
    exit(EXIT_SUCCESS);
}

strcat は path に適用されますが、最終的に path2 も変更されます。誰かが何が起こっているのか教えてくれたらとてもありがたいです:)ありがとう

走る

./program 3 example/mountdir/location2.csv example/rootdir/location2.csv

出力:

例/rootdir/location2.csv

エンドライン

4

2 に答える 2

6

バッファをオーバーランしています。元の argv[2] と argv[3] はメモリ内で連続している可能性が非常に高いです。argv[2] の末尾に到達strcatすると、argv[3] が指すメモリに書き込みます。作成しようとしている大きな文字列を保持するには、新しいバッファーを割り当てる必要があります。

于 2011-08-16T12:48:00.893 に答える
3

まず、argv[2]に書き込むことはできません。(そうすることで、実装に依存するか、未定義の動作が発生します。区別は重要ではありません。実行しないでください)。

2番; 混乱はどこにありますか?おそらく、argv[1]の直後にargv[2]を使用してメモリがレイアウトされているため、「example / mountdir / location2.csv \ 0example / rootdir/location2.csv」のようになります。argv [2](path)は最初の「e」を指し、path2はヌルバイトに続く「e」を指します。パスにstrcatすると、\ 0から始まるデータが書き込まれるため、\ 0は「。」に置き換えられ、「e」はエンドラインの「e」に置き換えられます。これで、path2は2番目を指します。文字列'.endlines'の文字なので、それを出力して出力"endlines"を取得します。

于 2011-08-16T12:55:45.687 に答える