将pointee设置为NULL,以便指向该地址的任何指针都为NULL

时间:2010-04-29 02:31:30

标签: c pointers

有没有办法将指针指向的内存中的位置设置为NULL,以便指向该位置的任何其他指针都为NULL?

4 个答案:

答案 0 :(得分:5)

不是试图保护自己免受自己的错误,有什么方法可以向他们学习,以便将来你不会再犯同样的错误? : - )

所有这些事情,例如当释放它们后面的内存时将指针设置为NULL,或使用“安全”字符串函数,相信即使使用所谓的不安全事物也可以完全安全。知道他们正在做什么的人的手。

我的建议是要么学习你想要使用的任何语言的陷阱,要么转向你觉得更安全的语言。你所谈论的是类似于引用计数的东西,并且有许多语言都有这个(Objective-C让人想起来)。

但是,如果您要或者被迫使用C代码,学习语言,包括它的黑暗面 - 你将成为一个更好的编码器。


顺便说一句,我认为你所要求的是一种跟踪指针别名的方法,这样,如果释放一个后面的内存,所有别名都会自动设置为NULL:

char *x = malloc(50);
char *y = x;
free (x);
// Both x and y are now magically set to NULL.

可以通过在C中做一个间接形式来实现这一点。换句话说,拦截malloc(手动或使用一些类似gcc的懒惰绑定技巧),这样,而不是返回一个指针在分配的块中,它返回一个指向分配块的指针。

还必须修改free调用,以便它们释放块但不释放已分配的指针(将设置为NULL)。然后,代码中的间接操作必须是双重间接(**x而不是*x):

char **x = mymalloc(50);
char **y = x;
myfree (x);
// Both *x and *y are now magically set to NULL.

以图形形式:

+---+
| x | -+
+---+  |   +--------+      +------+
       +-> | tmp000 | ---> | data |
+---+  |   +--------+      +------+
| y | -+
+---+

当您致电myfree时,data将被释放,但不会被tmp000指针释放。它将被设置为NULL,因此无论您使用x还是y尝试进入data,都会出现错误。

当然,这有一个问题就是让指针四处乱晃,另外一个问题就是看到这段代码的第一个体面的C编码器会跟踪你,并打败你: - )


可能通过在tmp000中使用引用计数来解决“四处寻找”问题,但您必须确保跟踪指针的所有副本,例如使用char **y = mydup(x);。< / p> 对于所有意图和目的而言,“打败你的纸浆”问题是不可解决的。

答案 1 :(得分:2)

没有。归零内存对指向该内存的指针没有影响。当然,在释放后你不能将内存归零。

答案 2 :(得分:2)

空指针表示它不指向任何内存位置。因此,只要它指向一个内存位置,就没有什么可以放在那个内存位置,这会改变......它指向一个内存位置这一事实。

这是空集和空集之间的区别。如果我清空一罐饼干,我仍然有一罐饼干(空套)。为了得到null,我必须彻底摆脱罐子。我对jar的内容所做的一切都改变了我有一个罐子的事实。

tl;博士:没有

答案 3 :(得分:1)

指针只是一个地址。如果地址为0,则在大多数系统上,它将是空指针。在检查指针是否为空时,不会以任何方式访问存储在指针引用的地址中的数据。仅在取消引用指针时才从内存加载该数据。