0

我正在尝试连接两个字符串,然后在 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 回答