繁体   English   中英

了解C ++中的指针初始化行为

[英]understanding pointer initialization behavior in C++

您好stackoverflow社区,我正在研究C ++中的指针。 我在golang和python中有一点背景,但是在C或C ++中却没有,所以请谅解,因为我的理解有误。 让我发布一段运行良好并给出段错误的代码。

  • 1个

这幅画5

int var = 5;
int *p = &var;
cout << *p << endl;
  • 2

这也打印5

int *p;
p = &var;
cout << *p << endl;

打印5 (因为p是指向int的指针,而var的地址是指向int的指针)。

然而,

  • 3

这一段。

int *p;
*p = var;
cout << *p << endl;

之所以会发生这种情况,是因为我正在将整数变量分配给应该是指向整数的指针的变量。 为什么它在编译时没有显示不兼容的类型错误,而不是给出分段错误? 给出分段错误的程序试图执行的操作是什么?

  • 4

这个也有段错误

int *p;
*p = 5;
cout << *p << endl;

也会引发段错误。 我对上述代码的理解是,我声明了一个指向int的指针,并且正在将一个整数值分配给一个指向整数的已取消引用的指针,但是由于未初始化该变量,因此编译器尚未在堆栈上分配内存。用于存储值(有点像悬空指针行为?)如果是原因,为什么会引发分段错误,该错误的原因是访问程序无法访问的内存?

  • 如果仅声明变量且未初始化变量,则编译器是否会完全忽略变量名称,并将其视为不存在的变量名称?

谢谢。

为什么它在编译时没有显示不兼容的类型错误,而不是给出分段错误?

因为类型是兼容的。 *pint类型, var也是int类型。 您在这里处理的是运行时的问题,而不是编译时的问题。

给出分段错误的程序试图执行的操作是什么?

*运算符取消引用指针。 这意味着,指针的地址取,并在该地址中的内容被检索。

在您的错误情况下,您将指针保留为未初始化状态。 因此,取消引用操作失败,因为引用的地址不确定。

如果仅声明变量且未初始化变量,则编译器是否会完全忽略变量名称,并将其视为不存在的变量名称?

一点也不。 声明将名称引入特定范围。 在您的示例中,您有一些定义 :它们告诉编译器为其分配一定的空间。

创建指针时,它包含一些垃圾地址。 当您尝试取消引用并写入一些值时,您导致了不确定的行为。 您必须在堆栈上分配一些现有变量的地址或在堆上分配内存,然后才能取消引用它。
就像您在前两个示例中所做的一样。 您还可以在堆上分配一些内存,并将该内存的地址分配给指针。
int *ptr = new int;
现在,您可以取消引用此指针(假设未引发bad_alloc异常),然后为该指针指向的内存分配一个值。

在上一篇中,您写了:

int *p;
*p = 5;
cout << *p << endl;

但是在这种情况下,您尚未为p分配值。 您必须先为指针分配一个值,然后再使用它。 您可以尝试如下操作:

int *p;
p = &var; //or another address of integer variable
*p = 5;
cout << *p << endl;

简而言之,我想强调一点,在使用指针之前,必须先将其赋值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM