【问题标题】:Heap corruption detected | C检测到堆损坏 | C
【发布时间】:2019-03-07 09:06:42
【问题描述】:

当我从控制台调用程序时,我正在用 C 语言制作一个小程序来为我制作 .cpp 和 .h 文件。它正在工作,但是当我使用该程序时,在我按下回车键并生成文件后,我收到一个弹出错误: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;
}

【问题讨论】:

  • name = argv[1]; 然后你做free(name)。你不能free(argv[1]),你需要释放malloc 返回的东西。
  • name = argv[1];?请改用strcpy(name, argv[1]);。此外,在这些分配中,包括strcat 的额外空间。
  • 别忘了 C 中的 char 字符串实际上称为 null-terminated 字节字符串。您还需要为空终止符分配空间(strlen 不计算在内)。

标签: c console-application


【解决方案1】:

你没有分配足够长的时间

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”需要空间而不忘记空终止字符,所以解决方案可以是:

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 即使我们通常有足够的内存用于需要少量内存的程序


你的 main 可以是:

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;
}

【讨论】:

  • @MaxPrakken 你在编译时遇到这个问题还是在执行时出现错误导致无法打开文件?
  • 感谢您的解决方案,效果很好,我更了解我现在在做什么,我删除了我的最后一条评论,因为我是个白痴。
  • 这是一个执行问题,但这是因为在我的环境设置中,当我在调试时编译时它仍在发布。所以这对我来说很愚蠢,现在可以完美运行
猜你喜欢
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 2013-07-06
  • 2011-07-24
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多