Память забита - PullRequest
       20

Память забита

1 голос
/ 26 декабря 2011

Я озадачен этим ответом. Может ли кто-нибудь помочь мне в этом и указать, где я делаю ошибку? Вывод на кодовой панели: "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;
}

Ответы [ 4 ]

11 голосов
/ 26 декабря 2011

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

free(s); // cannot free constant "heel"

То, что вы делаете, - это выделение фрагмента памяти и сохранение его местоположения (char *s).Затем вы перезаписываете эту ссылку единицей на строковую константу «пятка» (утечка памяти), которая не может быть free d.Чтобы сделать это так, как вам нужно, вы должны скопировать константную строку в выделенную память:

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);
1 голос
/ 27 декабря 2011

Чтобы расширить ответ @ TimCooper:

  • первое, что вы делаете: char *s = (char *)malloc(10 * sizeof(char));
  • затем: s = "heel";

Первая строка выделяет память и назначает расположение этой памяти для s. Но вторая строка переназначает s в ячейку памяти постоянной строки heel в стеке!

Это означает, что вы пытаетесь освободить () память в стеке, что недопустимо. И вы теряете память, так как то, что вы впервые выделили для s, теперь недоступно.

Если вы хотите записать строку в память, указанную s, вы должны использовать что-то вроде strcpy() (или, лучше, strncpy()).

1 голос
/ 27 декабря 2011

Вы не можете free(s) - это постоянная память.

Попробуйте изменить s = "heel"; на strcpy(s,"heel");

1 голос
/ 27 декабря 2011
char *s = (char *)malloc(10 * sizeof(char));
  s = "heel";

Не делает то, что вы думаете, или что вы ожидаете с более современными языками

Первая строка выделяет некоторую память для 10 символов и возвращает ее адрес.

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

...