这段代码有用吗?

时间:2011-03-29 21:13:23

标签: c++ c

这段代码可以做什么吗?

int *n;
while (n!=0)
    {
        n = &n;
    }

7 个答案:

答案 0 :(得分:6)

由于多种原因,这是未定义的行为,所以谁知道。

  1. 在初始化之前使用n
  2. 重复为int **变量指定int *值。
  3. 因此它可能会触发Singularity ......但仅限于您的计算机上。

答案 1 :(得分:4)

这没有什么特别有用的。它将以我能看到的两种方式中的一种执行

<案例1

本地n偶然初始化为非零值。然后它将进入一个无限循环,其中本地的堆栈地址被分配给本地。这不会终止

<案例2

本地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的地址(几乎保证不为零)