异常的原因是什么?

问题描述 投票:0回答:3

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

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

但是如果我通过不需要的命令行获取额外的参数,那么这个错误就会消失。你能说出哪个问题在这里吗?

c windows
3个回答
3
投票

strcat(argv[1], ", Agniva welcomes you");

这正是原因 - 首先你只能在以下情况下访问argv[1]

if (argc > 1) // do something with argv[1]

第二,即使argv[1]指向有效的内存块 - 你只需用strcat覆盖它 - 将数据附加到它。在您的具体情况下argv[1]从堆分配,并写入内存块超过它的大小。结果你得到了一堆已被破坏。


0
投票

这是我之前对这个问题的评论,这几乎是一个完整的答案。

简而言之,没有为argv中的每个项目分配额外的内存空间,因此当您尝试将更多字符串strcat到它上面时,您将在缓冲区外写入​​,这会导致未定义的行为。当你提供了一个额外的参数时,你实际上是在写入另一个参数所在的内存。同样,这是特定于实现的,当您在另一个平台(如Linux)上运行该程序时,它仍可能成为未定义的行为。


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;
© www.soinside.com 2019 - 2024. All rights reserved.