简单的程序导致" Stack Smashing"

时间:2013-01-30 22:23:21

标签: c

我试图连接两个字符串,然后在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;
}

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

char st1[] = "wc -l ";
strcat(st1, argv[i]);

st1将在堆栈上分配,大小足以用于初始化它的字符串常量。然后你附加另一个字符串,可能(几乎可以肯定)破坏堆栈。