如何使用memset将内存指针设置为NULL?

4 c++ null pointers memset

我有一个结构

typedef struct my_s {

   int x;
   ...
} my_T;

my_t * p_my_t;
Run Code Online (Sandbox Code Playgroud)

我想设置的地址p_my_tNULL,到目前为止这是怎么了,我试着这样做:

memset (&p_my_t, 0, sizeof(my_t*))
Run Code Online (Sandbox Code Playgroud)

不过,这对我来说并不合适.这样做的正确方法是什么?


问题修正案 - 提出一个更复杂的问题:

这是我想要做的:

  • 两个过程,A和B.
  • 在A中的malloc p_my_t,B有N个线程并且可以访问它
  • 在A中开始删除,但我不能简单地释放它,因为B中的线程可能仍在使用它.
  • 所以我调用一个函数,将p_my_t的地址传递给B,在B中将其地址设置为NULL,这样B中的其他线程就不能再使用了
  • 从B回电后,我在A中释放内存

注意:没有标准的方法来通过进程之间的共享内存来管理内存分配.你将不得不做一些相当仔细的思考发生了什么.

Rob*_*ble 20

不要memset用来初始化空指针,因为这会将内存设置为所有位零,这不能保证是空指针的表示,只需这样做:

p_my_t = NULL;
Run Code Online (Sandbox Code Playgroud)

或等效的:

p_my_t = 0;
Run Code Online (Sandbox Code Playgroud)

  • 推荐谁?0不像NULL那样"表达",i = NULL表明我是一个指针,i = 0不是. (6认同)
  • 最好使用NULL.它更具可读性,并且在NULL定义发生变化的可能性很小的情况下,您的代码不会中断. (4认同)
  • 在 C++ 中,NULL 被定义为 0,因此编译器不会强制执行“i = NULL 表明 i 是一个指针”。C++0x 有 nullptr,这确实是强制执行的。 (2认同)
  • 关键是它让阅读你的代码的人很清楚。 (2认同)
  • 该标准保证 0 将被转换为空指针的正确位模式。它没有说明 NULL。NULL 只是为了与 C 代码向后兼容。 (2认同)