任何人都可以找出错误的原因吗?代码如下。
#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.
但是如果我通过不需要的命令行获取额外的参数,那么这个错误就会消失。你能说出哪个问题在这里吗?
strcat(argv[1], ", Agniva welcomes you");
这正是原因 - 首先你只能在以下情况下访问argv[1]
:
if (argc > 1) // do something with argv[1]
第二,即使argv[1]
指向有效的内存块 - 你只需用strcat
覆盖它 - 将数据附加到它。在您的具体情况下argv[1]
从堆分配,并写入内存块超过它的大小。结果你得到了一堆已被破坏。
这是我之前对这个问题的评论,这几乎是一个完整的答案。
简而言之,没有为argv中的每个项目分配额外的内存空间,因此当您尝试将更多字符串strcat到它上面时,您将在缓冲区外写入,这会导致未定义的行为。当你提供了一个额外的参数时,你实际上是在写入另一个参数所在的内存。同样,这是特定于实现的,当您在另一个平台(如Linux)上运行该程序时,它仍可能成为未定义的行为。
你无法知道为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;