【问题标题】:What is wrong with declaring *ptr=x after initialization of *ptr?在 *ptr 初始化后声明 *ptr=x 有什么问题?
【发布时间】:2021-07-26 01:35:57
【问题描述】:
int x=10;
int *p;
p=&x;
int **pp=&p;
cout<<**pp<<"\n"<<*p<<"\n"<<pp<<"\n"<<&p<<"\n";

在上述情况下一切顺利,但是当我改变了声明指针 p 的方式时:

int x=10;
int *p;
*p=x;
int **pp=&p;
cout<<**pp<<"\n"<<*p<<"\n"<<pp<<"\n"<<&p<<"\n";

它没有给出任何输出。 这是为什么呢?

【问题讨论】:

  • 您正在为 *p 分配一个值,而没有先为其分配空间。
  • 在第一个示例中,您将x 的地址分配给p。在另一个中,您将 x 的值分配给 p 当前指向的任何位置(它指向任何地方)
  • 它没有给出任何输出。为什么会这样?我怀疑你要么没有启用编译器警告,要么你忽略了编译器的警告。

标签: c++ pointers reference initialization declaration


【解决方案1】:
int *p;

这里,p 是默认初始化的,因此它有一个不确定的值。它不指向任何对象。读取不确定指针的行为是未定义的。

*p=x;

在这里,您读取不确定的指针值并尝试通过它间接访问未指向的值。程序的行为未定义。

p=&x;

这为p 分配了一个值,因此该值不再是不确定的。由于这个新的指针值是有效的,以后可以间接通过它(只要指针保持有效)。

【讨论】:

    【解决方案2】:

    你定义了一个指针而不给它分配内存,所以它是一个野指针,不指向内存的任何部分

    【讨论】:

      【解决方案3】:

      这个:

      int *p;
      p=&x;
      

      x的地址分配给p

      这个:

      int *p;
      *p=x;
      

      做一些完全不同的事情。它取消引用p 并将x 的值分配给结果。 p 未初始化。它不指向int。因此,取消引用 p 并尝试评估 x 的值会导致 undefined behavior

      您将指针的值(int 的内存地址)与其指向的值(int)混淆了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-01
        相关资源
        最近更新 更多