Свободная память перед возвращением
Предположим, у меня есть следующая программа
#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 свисающим указателем. Доступ к памяти, которая уже была освобождена, может привести к неопределенному поведению.
Почему это успешно напечатает "привет", когда я бесплатно перед возвращением?
Кодекс нарушил правила.
Попытка использовать предыдущее значение в myString
после free(myString)
является неопределенным поведением (UB). @ Ли Дэниел Крокер
Одним из возможных UB является то, что данные все еще будут там позже.
Я думал, что ничего не печатать
Это было бы определенным поведением, но это UB. Вполне возможно, что ничего не будет напечатано, код выдаст ошибку, закрутится в цикле навсегда, или....
Это UB.
Использование указателя после free() - хороший вопрос / ответ. Перемещение это в вики