关于用free释放空间解决方法

关于用free释放空间
main()
{
  chat *s;

  s = (char*)malloc(2*sizeof(char));//开辟了空间
  
  scanf("%s",s);

  while(*s)
 {
  s --;
 }

  free(s);//经过while后,*s=“”,为空
}

  这是可否还要free?
  可是,当我运行free(s)之后,会出来一堆东西有:
  backtrace
  memory map 等等
  这是怎么回事?这些提示是什么意思?

------解决方案--------------------
你用malloc在堆空间申请了一块内存,现在你把唯一的指针指向了字符串的末尾,现在进行释放内存操作,肯定出问题啦。free又不知道你想从哪里开始释放的。
------解决方案--------------------
s指针指的不是初始位置了,在用之前把初始位置保存起来:
char *p = s;
...

if (p)
{
free(p);
}

------解决方案--------------------
这是属于溢出。如果s不是指向了开始申请的空间的首地址。那么调用free函数很可能会出现内存溢出的情况。还要注意的是使用malloc后一定要检查是否内存申请成功。如果malloc不成功,s会指向NULL。
C/C++ code

main()
{
  chat *s;

  s = (char*)malloc(2*sizeof(char));//开辟了空间
   if (s == NULL) {
     fprintf(stderr, "malloc failed");
     exit(EXIT_FAILURE);
  }
  char *p = s;
   
  scanf("%s",s);

  while(*s)
 {
  s --;
 }

  free(p);   /*这样是没问题的*/
}

------解决方案--------------------
backtrace是你在操作内存的时候,出现了内存操作错误,系统会启动backtrace讲调用的函数栈信息打印出来,你可以根据这个调用关系分析哪里出错了。

还有就是你只能释放你自己申请的空间,不能随便释放别人申请的空间。释放空间要明白现在这个空间是否要释放,位置是否正确,否则胡乱释放会对系统有影响。
------解决方案--------------------
int i = 10;
int* a = (int*)malloc(sizeof(int) * 10);
a = &i; // 改变了

这时候,你原来分配的内存就收不回来了