C 简单的程序结果是;“捣毁烟囱”;

C 简单的程序结果是;“捣毁烟囱”;,c,C,我试图连接两个字符串,然后在UNIX环境中进行系统调用。程序执行我想要的操作,但终止时出现错误***检测到堆栈崩溃*** 为什么会这样 这是我的密码: 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.

我试图连接两个字符串,然后在UNIX环境中进行系统调用。程序执行我想要的操作,但终止时出现错误
***检测到堆栈崩溃***

为什么会这样

这是我的密码:

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;
}
main(int-argc,const-char*argv[])
{
//检查是否有大于文件名的参数
如果(argc>1)
{
int i;
//argv[0]是从1开始的程序名。

for(i=1;i
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);
}

st1
将被分配到堆栈上,刚好足够用于初始化它的字符串常量。然后您可能(几乎肯定)附加另一个字符串破坏书堆。

听起来很顽皮……问题很明显。你在捣毁书堆!这个问题本应该是一本书能够回答的。我们的时间最好用在那些已经读过书、成功完成了练习但仍有问题的人身上。你在读哪本书?@modifiablelvalue,50度…@modifiablevalue我不是在读一本书。我只是在写程序,当我有了新的想法并通过网络学习时,他们会来找我。我不认为这与stackoverflow无关。如果你认为这是浪费时间,那么不要回答或标记它。@Nick如果你需要问stackoverflow这个代码有什么问题,那么你当前的学习的方法显然是行不通的。你如何确保你的C程序在未来的系统中能继续正常工作,这些系统与现在的系统有着无法想象的不同?未定义行为的问题是,在编译器或系统出现毫无意义的更新之前,它可能会按照预期工作。我建议K&R的“C编程语言,第二版”。
char st1[] = "wc -l ";
strcat(st1, argv[i]);