这段代码可以做什么吗?
int *n;
while (n!=0)
{
n = &n;
}
答案 0 :(得分:6)
由于多种原因,这是未定义的行为,所以谁知道。
n
。int **
变量指定int *
值。因此它可能会触发Singularity ......但仅限于您的计算机上。
答案 1 :(得分:4)
这没有什么特别有用的。它将以我能看到的两种方式中的一种执行
<案例1本地n
偶然初始化为非零值。然后它将进入一个无限循环,其中本地的堆栈地址被分配给本地。这不会终止
本地n
偶然被初始化为0
,循环将不会执行。
答案 2 :(得分:3)
这甚至不是有效的C程序。根据规范, 6.5.5投射算子部分,第3段:
涉及指针的转换......应通过显式转换来指定。
答案 3 :(得分:1)
由于n
变量未初始化,因此会有不确定的行为。如果这也得到纠正,它将进入无限循环(如果n
被初始化为非空值)或者它将什么也不做。
它不编译。如果你插入一个强制转换来进行编译。 BTW,你将int**
分配给int*
,编译器可能会发出这样的代码的警告。
注意:初始化n
时,clang
非常智能,可以将代码优化为nop
(如果初始化为0)或无限循环。
答案 4 :(得分:1)
它将一个常量if if int类型存储到int *类型的变量中。嗯...它可能永远循环,因为它不太可能&amp; n == 0.而且,哦,第一次“n”的内容未定义!
答案 5 :(得分:1)
首先,你有一个来自不兼容指针类型的作业(你试图将int **
分配给int *
);我不记得确切地说它是应该触发错误还是只是警告(在C中很可能是一个警告,在C ++中它可能是一个错误)。
然后,即使你在那里放置一个强制转换(n=(int *)&n
),该代码也会显示未定义的行为,因为在第一次迭代时你正在读取一个未初始化的变量。可能没有什么非常糟糕的事情发生(毕竟你没有解除引用那个指针),但是根据经验,如果已经使用了堆栈区域n
,那么循环是否会被执行是未定义的非零,否则可能为零。
如果纠正所有错误/ UB,那就是:
int *n=NULL;
while (n!=0)
{
n = (int *) &n;
}
它将执行迭代,因为它从NULL
开始(保证为0),然后它将从循环中退出,因为没有有效指针比较等于0(同样,这是有保证的)按标准)。
就有用性而言:对于“真正的”应用程序而言,它完全没用。
答案 6 :(得分:0)
取决于n
的初始值,但很可能会进入无限循环。
n
是一个本地(堆栈)变量,是指向int。n
包含非零值(例如,不是NULL
)
n
的值设置为n
的地址(几乎保证不为零)