Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将pointee设置为NULL,使指向该地址的任何指针都为NULL_C_Pointers - Fatal编程技术网

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

C 将pointee设置为NULL,使指向该地址的任何指针都为NULL,c,pointers,C,Pointers,有没有办法将指针指向的内存位置设置为NULL,而不是将指针指定为NULL,这样指向该位置的任何其他指针都将为NULL?否。将内存归零不会影响指向该内存的指针。当然,您不能在释放内存后将其归零。空指针意味着它不指向任何内存位置。因此,只要它指向一个内存位置,你就不能把任何东西放进那个内存位置,来改变它指向内存位置的事实 这将导致空集和空集之间的差异。如果我清空一罐饼干,我仍然有一罐饼干(空的一套)。要得到空值,我必须完全去掉这个罐子。我对罐子的内容所做的任何事情都不会改变我有一个罐子的事实 tl;

有没有办法将指针指向的内存位置设置为NULL,而不是将指针指定为NULL,这样指向该位置的任何其他指针都将为NULL?

否。将内存归零不会影响指向该内存的指针。当然,您不能在释放内存后将其归零。

空指针意味着它不指向任何内存位置。因此,只要它指向一个内存位置,你就不能把任何东西放进那个内存位置,来改变它指向内存位置的事实

这将导致空集和空集之间的差异。如果我清空一罐饼干,我仍然有一罐饼干(空的一套)。要得到空值,我必须完全去掉这个罐子。我对罐子的内容所做的任何事情都不会改变我有一个罐子的事实


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

与其试图保护自己不受自己的错误的影响,还有什么方法可以让您从中吸取教训,以便将来不再犯同样的错误?:-)

所有这些事情,比如当指针背后的内存被释放时将指针设置为NULL,或者使用“安全”字符串函数,都掩盖了这样一个事实,即即使使用所谓的不安全的东西,在知道自己在做什么的人手中也是完全安全的

我的建议是要么学习你想使用的任何语言的通病,要么转向一种你觉得更安全的语言。您所说的是类似于引用计数的东西,很多语言都有这种功能(Objective-C就是其中之一)

但是,如果你打算或被迫用C语言编写代码,学习C语言,包括它的黑暗面——你会成为一个更好的代码编写者


另一方面,我认为您需要的是一种跟踪指针别名的方法,这样,如果您释放指针后面的内存,所有别名都会自动设置为空:

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
):

以图形形式:

+---+
| x | -+
+---+  |   +--------+      +------+
       +-> | tmp000 | ---> | data |
+---+  |   +--------+      +------+
| y | -+
+---+
调用
myfree
时,将释放
数据
,但不会释放
tmp000
指针。它将被设置为NULL,这样,无论您使用
x
还是
y
尝试获取
数据,您都会得到一个错误

当然,这有一个问题,那就是留下指针,还有一个问题,就是第一个看到这段代码的体面的C程序员会跟踪你,把你打得一败涂地:-)


使用
tmp000
中的引用计数可能可以解决“指针四处乱放”问题,但您必须确保跟踪指针的所有副本,例如使用
char**y=mydup(x)


“把你打成肉酱”的问题,无论出于何种目的,都是无法解决的。

最后一段是什么意思?从技术上讲,如果你把饼干倒空,你就不会有一罐饼干,你会有一罐饼干——我6岁的儿子和4岁的女儿最近对此进行了长时间的讨论,这是共识:-)但这是一个很好的类比。实际上,空指针指向内存地址0处的内存。在大多数系统上,您不能在该地址存储任何内容,因为操作系统不允许您这样做。如果查看系统头文件,您会看到类似“#define NULL 0”的内容。实际上,Daniel,ISO C中没有要求空指针的基础值为0,只是源代码将文本0视为空指针。某些系统具有底层非零位模式。此外,根据标准取消对空指针的引用是一种未定义的行为,不管操作系统怎么想。换句话说,这不是环境有发言权的事情,标准规定了这一点。你不喜欢你不能取消引用空指针的事实?确切地说,是血腥的纸浆:)我现在看到的“继承”代码中充满了
my_free((void**)&pointer)。。我的工作就是让它在一个严格的平台上工作。那些以“安全”的名义盲目取消引用类型双关语指针的人(因为他们失去了对指针的跟踪)将被处以私刑。
+---+
| x | -+
+---+  |   +--------+      +------+
       +-> | tmp000 | ---> | data |
+---+  |   +--------+      +------+
| y | -+
+---+