任何人都可以找出错误原因吗? 代码如下。
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main(int argc, char *argv[]){
strcat(argv[1], ", Agniva welcomes you");
printf("%s", argv[1]);
getch();
return 0;
}
实际上,该程序将修改argv[1]
参数(这是一个说法),该参数由另一个程序作为引用调用进行调用。
但是我得到了
Unhandled exception at 0x00007ffd21d41cd0 in greet.exe:
0xC0000374: A heap has been corrupted.
但是,如果我通过命令行使用了多余的参数,那么该错误将消失。你能说出这是什么问题吗?
答案 0 :(得分:3)
strcat(argv[1], ", Agniva welcomes you");
这是完全有道理的-最初,只有在以下情况下您才能访问argv[1]
:
if (argc > 1) // do something with argv[1]
第二,即使argv[1]
指向有效的内存块-您只需用strcat
覆盖它-向其追加数据。在具体情况下,argv[1]
是从堆中分配的,并且写入了超出其大小的内存块。结果您得到了堆已损坏。
答案 1 :(得分:0)
这是我以前对这个问题的评论,几乎是完整的答案。
简而言之,argv中没有为每个项目分配额外的内存空间,因此,当您尝试在其上添加更多字符串时,您正在缓冲区外进行写入,这将导致未定义的行为。提供额外的参数时,实际上是在写另一个参数所在的内存。同样,这是特定于实现的,并且当您在另一个平台(例如Linux)上运行该程序时,仍然可能会变成不确定的行为。
答案 2 :(得分:0)
您无法知道为argv [1]分配了多少内存,但仍尝试使用另外20+个字节对它进行存根。
strcat(argv[1], ", Agniva welcomes you");
也许是这样的
if( argc < 2 )
return -1;
char *oBuf = calloc( strlen( argv[1] ) + 25 /* for this ", Agniva welcomes you" */ , 1);
sprintf( oBuf, "%s%s",argv[1], ", Agniva welcomes you");
printf("%s", oBuf);
return 0;