C语言为什么这个局部变量没有被释放

int* function(){
  int a =100;
  int * ptra = &a;
 return ptra;
};
int main(){
  int * ptr;
 ptr =function();
 printf("data is %d",*ptr);
}

上述代码打印为100; 为什么变量a没有被释放掉?
如果改成以下代码,变量a会被释放掉,出现segment fault。这是为什么?

int* function(){
  int a =100;
 return &a;
};
int main(){
  int * ptr;
 ptr =function();
 printf("data is %d",*ptr);
}

第二种因为函数调用结束后该局部自动变量被抛弃,这个指针指向一个不再存在的对象(野指针),是无意义的,故而会出现segment fault

第一种你多次调用后,发现地址并没有发生变化的,也就是说,你每一次调用function()返回的地址都是一样的,所以那样的使用是不安全的,那个对的数据,只是遗留下来可被后续压栈操作覆盖的无用数据

两种情况下 a 都释放了,返回指向局部变量的指针是未定义的行为: