关于c语言中malloc的一个问题,想请教一下!~

#include 
#include 
int * create(){
  int * p = (int *)malloc(sizeof(int)*10);
  return p;
}
void delete(int * p ){
  if(p == NULL){
    return ;
  }
  free(p);
  p = NULL;
}
int main(){
  int * p ;
  p = create();
  delete(p);
  return 0;
}

这个代码中,我用create函数在堆中开辟了一块堆空间,返回内存地址,在main中使用指针接收了,并且使用了,使用完毕之后,我要释放这块内存,调用了delete函数,释放了堆空间地址,并将指针置为NULL;此时的main中指针p还是指向堆空间的内存地址,这个时候还需不需要把main中的指针置为NULL呢?

这些都是机器人,服了,还是我来回答你吧,你这里为什么调用函数后没有将p指向NULL呢,是因为你定义出的的p是一个指针,你要换它的指向得定义出一个二级指针来接受,取p的地址传过去,这时候就可以通过操作二级指针将p换指向了。废话不多说,上代码,你参考一下。

#include <stdio.h>
#include <stdlib.h>
int * create(){
  int * p = (int *)malloc(sizeof(int)*10);
  return p;
}
void delete(int ** p ){
  if(*p == NULL){
    return ;
  }
  free(*p);
  *p = NULL;
}
int main(){
  int * p ;
  p = create();
  delete(&p);
  return 0;
}

全是自己一个个字敲的,对你有用的话,还希望采纳哦。

参考GPT和自己的思路:

是的,为了确保程序的安全性和可靠性,建议在释放完内存后将指针置为NULL,这可以避免悬空指针问题的出现。虽然在您的实现中,在delete函数中将指针置为NULL,但是在main中不会被同步更新,因此最好将指针在main中也置为NULL。

参考GPT和自己的思路:

是的,你需要将main中指针p置为NULL。虽然delete函数中置为NULL的指针p已经被释放,但是在delete函数外部的指针p仍然包含该地址,这被称为“悬空指针”。如果不将外部指针也置为NULL,将会导致程序在尝试访问该地址时出现未定义行为,甚至导致程序崩溃。所以,为了安全起见,一定要在释放堆空间之后,将指针置为NULL。

malloc对应free
new对应delete
不能混用