Свободная память перед возвращением

Предположим, у меня есть следующая программа

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

char *returnSomething()
{
    char *myString;
    myString = malloc(sizeof(char) * 50);

    strcpy(myString,"hello");

    free(myString);
    return myString;
}

int main(int argc, char const *argv[])
{

    char *myString = returnSomething();
    printf("%s",myString);

    return 0;
}

Почему это успешно напечатает "привет", когда я бесплатно перед возвращением? Я думал, что ничего не напечатает, так как я освободил память, а потом вернул строку. Я предполагал, что мне всегда приходилось освобождать его в основном после печати.

Это просто мой компилятор Mac?

2 ответа

Когда вы вызываете free(myString), память, на которую указывает myString, освобождается, но значение myString остается неизменным, что делает myString свисающим указателем. Доступ к памяти, которая уже была освобождена, может привести к неопределенному поведению.

Использование указателя после free()

Почему это успешно напечатает "привет", когда я бесплатно перед возвращением?

Кодекс нарушил правила.

Попытка использовать предыдущее значение в myString после free(myString) является неопределенным поведением (UB). @ Ли Дэниел Крокер

Одним из возможных UB является то, что данные все еще будут там позже.

Я думал, что ничего не печатать

Это было бы определенным поведением, но это UB. Вполне возможно, что ничего не будет напечатано, код выдаст ошибку, закрутится в цикле навсегда, или....

Это UB.


Использование указателя после free() - хороший вопрос / ответ. Перемещение это в вики

Другие вопросы по тегам