0

2 つの文字列を連結し、UNIX 環境でシステム コールを実行しようとしています。プログラムは私が望むことをしますが、エラーで終了します*** stack smashing detected ***

なぜこうなった?

これが私のコードです:

main(int argc, const char* argv[])
{

    //Check if there is an arg otehr than file name
    if(argc > 1)
    {
        int i;
        //argv[0] is prog name start at 1.
        for(i=1; i<argc; i++)
        {

            char st1[] = "wc -l ";
            strcat(st1, argv[i]);
            printf("%s",system(st1));
        }

    }
    else
    {
        printf("\nExiting. No input files given.\n");
    }
    return 0;
}
4

2 に答える 2

2

str1含めるのに十分な要素しかないため、結果の文字列を含めるのに十分な大きさではありませんwc -l \0(char[7]配列です)。呼び出しstrcat()は配列の境界を超えて書き込み、メモリを上書きすべきではありません。

十分なメモリを確保するために、着信引数の長さに基づいて計算された十分なスペースを動的に割り当てます。

char* s = malloc(7 + strlen(argv[i])); /* 7 is 6 for "wc -l " and null term. */
if (s)
{
    sprintf(s, "wc -l %s", argv[i]);

    free(s);
}
于 2013-01-30T22:24:18.930 に答える
0
char st1[] = "wc -l ";
strcat(st1, argv[i]);

st1初期化に使用される文字列定数にちょうど十分な大きさで、スタックに割り当てられます。次に別の文字列を追加すると、(ほぼ確実に) スタックが破損する可能性があります。

于 2013-01-30T22:25:04.233 に答える