在以下代码中,指针指向自己的内存地址。
#include <stdio.h>
int main()
{
void * ptr;
ptr = &ptr;
return 0;
}
如果指针能够指向自己的内存地址,这是否有意义?
#include <stdio.h>
int main()
{
void * ptr;
ptr = &ptr;
return 0;
}
如果指针能够指向自己的内存地址,这是否有意义?
ptr == &ptr
比较,因为类型将不同,必须进行转换。 - cmaster - reinstate monicavoid * ptr = ptr;
是不合法的。 - alk指针指向自己的内存地址。
这是合法的。
它是否“有意义”完全取决于上下文和“主要是可选的”思考方式。
从法律上讲,这是合法的C语言分配。但问题是用于什么目的。我认为这只是学术考虑,没有任何实际用途。
还有一个尚未提及的方面是,它违反了严格类型检查。
如果ptr
的类型为void *
,那么&ptr
的类型就是void **
,由于类型不匹配(void *
与void **
),不能将其赋值给ptr
。
然而,当涉及到指针类型时,C和C++通常非常宽松,每当一个void *
被赋值时,因为void *
应该能够指向任何东西。
但是假设您实际上想要正确地取消引用ptr
,则您需要在分配后像这样执行:
*(void **)ptr = ...
假设您实际上想要在某个时刻取消引用它。
void
指针没有严格类型限制,因此不存在这样的规则。在 C 语言中,从任何其他指针类型到 void
指针或者从 void
指针到任何其他指针类型的转换都是合法的。但在 C++ 中,这种转换是不被允许的。 - alk