检测到堆损坏| C

时间:2019-03-07 09:06:43

标签: c console-application

当我从控制台调用该程序时,我会用C语言编写一个小程序来为我创建.cpp和.h文件。它可以正常工作,但是当我使用该程序时,按Enter键并在其中创建文件后,出现弹出错误:HEAP CORRUPTION DETECTED。

有人可以帮我吗?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>
#include <direct.h>

#pragma warning(disable : 4996)

int main(int argc, char*argv[]) {
    if (argc < 2 ) {
        printf("Not enough arguments given: usage [name]");
        return;
    }

    char* name=(char*)malloc(strlen(argv[1]));
    name = argv[1];
    char* name2 = (char*)malloc(strlen(name));
    strcpy(name2, name);

    strcat(name, ".cpp");
    strcat(name2, ".h");

    name[strlen(name) + 1] = '\0';
    name2[strlen(name2)+ 1] = '\0';

    FILE * fp = fopen(name, "w");
    FILE * fp2 = fopen(name2, "w");

    free(name);
    free(name2);

    return 0;
}

error popup

1 个答案:

答案 0 :(得分:4)

您分配的时间不足

char* name=(char*)malloc(strlen(argv[1]));
name = argv[1];
char* name2 = (char*)malloc(strlen(name));
strcpy(name2, name);

strcat(name, ".cpp");
strcat(name2, ".h");

因为您需要用于“ .cpp”和“ .h”的空间而又不会忘记null终止字符,所以解决方案可以是:

size_t alen = strlen(argv[1]);
char * h = malloc(alen + 3);
char * cpp = malloc(alen + 5);

strcpy(h, argv[1]);
strcpy(h + alen, ".h");
strcpy(cpp, argv[1]);
strcpy(cpp + alen, ".cpp");

以及免费的 h cpp

name[strlen(name) + 1] = '\0';
name2[strlen(name2)+ 1] = '\0';

您已经假定具有空终止字符可以使用 strlen 。 (当然,使用我上面的建议,这些行是不存在的)

free(name);

您释放了argv[1],但您不能这样做。 (当然,根据我上面的建议,您的两个最初的免费帐户不存在)

if (argc < 2 ) {
    printf("Not enough arguments given: usage [name]");
    return;
}

您什么也不返回,应该是 int

您还需要检查 fopen 是否成功,以及 malloc ,即使我们通常有足够的内存来存储需要较少内存的程序


您的主要可以是:

int main(int argc, char*argv[]) {
    if (argc < 2 ) {
        printf("Not enough arguments given: usage %s [name]\n", *argv);
        return -1;
    }

    size_t alen = strlen(argv[1]);
    char * h = malloc(alen + 3);
    char * cpp = malloc(alen + 5);

    if ((h == NULL) || (cpp == NULL)) {
      puts("not enough memory");
      return -1;
    }

    strcpy(h, argv[1]);
    strcpy(h + alen, ".h");
    strcpy(cpp, argv[1]);
    strcpy(cpp + alen, ".cpp");

    FILE * fph = fopen(h, "w");

    if (fph == NULL) {
      printf("cannot open %s\n", h);
      return -1;
    }

    FILE * fpcpp = fopen(cpp, "w");

    if (fcpp == NULL) {
      printf("cannot open %s\n", cpp);
      return -1;
    }


    free(h);
    free(cpp);

    /* write in files */

    fclose(fh);
    fclose(fcpp);

    return 0;
}