Подтвердить что ты не робот

Munmap_chunk(): неверный указатель

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

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

char * first()
{
    char * word = malloc(sizeof(char) * 10);
    word[0] = 'a';
    word[1] = 'b';
    word[2] = '\0';
    return word;
}

char * second ()
{
    char * word = malloc(sizeof(char) * 10);
    word = "ab";
    return word;
}

int main ()
{
    char * out = first();
    printf("%s", out);
    free(out);
    out = second();
    printf("%s", out);
    free(out);
    return 0;
}

Функция first() работает правильно, но second() (точно free(out)) генерирует ошибку:

Ошибка в `./a.out ': munmap_chunk(): недопустимый указатель: 0x0000000000400714 *** ababAborted (core dumped)

Я не понимаю, почему первая функция правильная, а вторая - нет. Может ли кто-нибудь объяснить, почему?

4b9b3361

Ответ 1

В функции second() присваивание word = "ab"; назначает новый указатель на word, переписывая указатель, полученный с помощью malloc(). Когда вы позже вызываете free() в указателе, программа вылетает из-за того, что вы передаете указатель на free(), который не был получен через malloc().

Назначение строковых литералов не влияет на копирование их содержимого, как вы могли подумать. Чтобы скопировать содержимое строкового литерала, используйте strcpy():

strcpy(word, "ab");

Ответ 2

В funxtion char * second -

 char * word = malloc(sizeof(char) * 10);
 word = "ab";

Второй оператор word = "ab"; изменяет word на выделение выделенной памяти. Вы не копируете строку "ab" в область кучи, выделенную malloc.

И до free память, не выделенная malloc или аналогичные функции, выдает сбой вашей программы.

Попытка освободить недействительный указатель (указатель на блок памяти, который не был выделен calloc, malloc или realloc) может повлиять на последующие запросы на распределение и вызвать ошибки.

Вы должны использовать здесь strcpy, также как и другие.