发生异常的原因是什么?

时间:2018-08-30 09:19:44

标签: c windows

任何人都可以找出错误原因吗? 代码如下。

#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.

但是,如果我通过命令行使用了多余的参数,那么该错误将消失。你能说出这是什么问题吗?

3 个答案:

答案 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;