我试图连接两个字符串,然后在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;
}
答案 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
将在堆栈上分配,大小足以用于初始化它的字符串常量。然后你附加另一个字符串,可能(几乎可以肯定)破坏堆栈。