指针很奇怪

时间:2015-11-25 19:53:21

标签: c++

请注意,我们将此视为学校练习问题,不确定我是否会在现实生活中使用它。

这样可行:

int main(){

  int *** niz[6];

  **niz[0] = new int(6);

  cout << ***niz[0];

}

但是不要这样做:

int main(){

  int **** niz[6];

  ***niz[0] = new int(6);

  cout << ****niz[0];

}

它导致segmen。故障。为什么这样,明星匹配?

但是

2 个答案:

答案 0 :(得分:3)

您不要在数组中插入有效地址,因此两者都是未定义的行为,即。在gcc下运行正常,但在clang下引起了段错误。要使其运行,您需要插入实际地址:

int main(){
  int * niz1 = new int(6);
  int ** niz2 = &niz1;
  int *** niz3 = &niz2 ;

  int **** niz[6];

  niz[0] = &niz3;

  std::cout << ****niz[0];
}

whooah,这是我第一次编码四级指针

答案 1 :(得分:1)

请注意niz完全未初始化

我们以*niz为例。它取消引用niz[0]处的地址。 niz[0]未被初始化,因此它是未定义的行为 你不需要考虑其他任何事情来弄清楚它为什么会出现分段错误。

两个程序都会产生未定义的行为。不幸的是,第一个运行正常。