Я озадачен этим ответом. Может ли кто-нибудь помочь мне в этом и указать, где я делаю ошибку? Вывод на кодовой панели "memory clobbered before allocated block"
Вы пытаетесь освободить постоянную память с помощью:
free(s); // cannot free constant "heel"
Что вы делаете, так это выделяете часть памяти и сохраняете ее местоположение (char *s). Затем вы перезаписываете эту ссылку на строковую константу "heel" (утечка памяти), которая не может быть freed. Чтобы заставить это вести себя так, как хотелось бы, вы должны скопировать константную строку в выделенную вами память:
strcpy(s, "heel");
Вот пример получения пользовательского ввода:
char *input = malloc(sizeof(char) * 16); // enough space for 15 characters + '\0'
fgets(input, 16, stdin);
// do something with input
free(input);
Ответ 2 · рейтинг 1 · SlavaNov
Нельзя free(s) - это постоянная память.
Попробуйте заменить s = "heel"; на strcpy(s,"heel");
Ответ 3 · рейтинг 1 · fge
Чтобы расширить ответ @TimCooper:
сначала вы делаете: char *s = (char *)malloc(10 * sizeof(char));
затем: s = "heel";
Первая строка выделяет память и назначает расположение этой памяти s. Но вторая строка переназначает s на ячейку памяти константной строки heel в стеке!
Это означает, что вы пытаетесь использовать память free() в стеке, что является незаконным. И у вас происходит утечка памяти, поскольку то, что вы сначала выделили для s, теперь недоступно.
Если вы хотите записать строку в память, на которую указывает s, вы должны использовать что-то вроде strcpy() (или, лучше, strncpy()).
Ответ 4 · рейтинг 1 · Martin Beckett
char *s = (char *)malloc(10 * sizeof(char));
s = "heel";
Делает не то, что вы думаете, или то, что вы ожидаете от более современных языков.
Первая строка выделяет память для 10 символов и возвращает ее адрес.
Вторая строка изменяет этот адрес, чтобы он указывал на постоянный блок памяти, выделенный во время компиляции, содержащий "пятку", теряющую ссылку на выделенную память - утечку.