Освобождение выделенной памяти приводит к зависанию программы в Visual Studio, но не в CodeBlocks - PullRequest
0 голосов
/ 16 февраля 2019

Допустим, я пытаюсь прочитать строку неизвестного размера во время выполнения и напечатать ее:

int n = 0;
printf("Enter word size:\n");
scanf("%d", &n);
char *str = (char*) malloc(n*sizeof(char));
if (str == NULL) {
    printf("Malloc failed\n");
    return 0;
}
printf("Enter string:\n");
char c;
int i = 0;
while (i < n&&scanf(" %c", &c) == 1) {
    str[i] = c;
    i++;
}
str[n] = '\0';
printf("Your string is: %s\n", str);
free(str);

Когда я пытаюсь запустить программу в CodeBlocks, она работает нормально, но когда я пытаюсьчтобы запустить его в Visual Studio (2017), он зависает, если я закомментирую free(str);, то он работает нормально.

Что может быть причиной и как это исправить?

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Вы не выделяете достаточно места для учета нулевого терминатора в строке.Выделение массива размером n сделает индексы 0 до n-1 допустимыми местоположениями для записи.Запись в str[n] вызывает повреждение кучи, что, в свою очередь, приводит к тому, что вызов free(str) будет неопределенным поведением.

Вам необходимо выделить не менее n+1 байтов для строки, содержащей n символов, для учетной записидля нулевого терминатора.

0 голосов
/ 16 февраля 2019
char *str = (char*) malloc(n*sizeof(char));

, но

str[n] = '\0';

вам нужно выделить еще 1:

char *str = (char*) malloc(n+1);

, иначе вы напишите после выделенного блока с неопределенным поведением

Примечаниепо определению sizeof(char) равно 1, поэтому умножать на него бесполезно.Актерский состав тоже бесполезен

...