Обнаружено повреждение кучи |С - PullRequest
0 голосов
/ 07 марта 2019

я делаю небольшую программу на C, чтобы создавать файлы .cpp и .h для меня, когда я вызываю программу из консоли.Она работает, но когда я пользуюсь программой, после нажатия клавиши ввода и файлов, в которых она была создана, я получаю всплывающее сообщение: ОБНАРУЖЕНА КОРРУПЦИЯ КАРТЫ.

Может кто-нибудь помочь мне с этим?

#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 Ответ

4 голосов
/ 07 марта 2019

Вы не выделяете достаточно долго в

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");

и где-то бесплатно ч и 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;
}
...