Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Память затерта

Автор вопроса: kevinОтветов: 4

Я озадачен этим ответом. Может ли кто-нибудь помочь мне в этом и указать, где я делаю ошибку? Вывод на кодовой панели "memory clobbered before allocated block"

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

int main(void)
{
    char *s = (char *)malloc(10 * sizeof(char));
    s = "heel";
    printf("%s\n",s);
    printf("%c\n",s[2]);
    printf("%p\n",s);
    printf("%d\n",s);
    free(s);
    return 0;
}
  • stackoverflow.com/questions/6571455/memory-clobbering-error Robert Harvey 27.12.2011

cmemorychar

Ответы

Ответ 1 · рейтинг 11 · Tim Cooper

Вы пытаетесь освободить постоянную память с помощью:

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 символов и возвращает ее адрес.

Вторая строка изменяет этот адрес, чтобы он указывал на постоянный блок памяти, выделенный во время компиляции, содержащий "пятку", теряющую ссылку на выделенную память - утечку.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы