[英]understanding pointer initialization behavior in C++
您好stackoverflow社区,我正在研究C ++中的指针。 我在golang和python中有一点背景,但是在C或C ++中却没有,所以请谅解,因为我的理解有误。 让我发布一段运行良好并给出段错误的代码。
这幅画5
int var = 5;
int *p = &var;
cout << *p << endl;
这也打印5
int *p;
p = &var;
cout << *p << endl;
打印5
(因为p是指向int的指针,而var的地址是指向int的指针)。
然而,
这一段。
int *p;
*p = var;
cout << *p << endl;
之所以会发生这种情况,是因为我正在将整数变量分配给应该是指向整数的指针的变量。 为什么它在编译时没有显示不兼容的类型错误,而不是给出分段错误? 给出分段错误的程序试图执行的操作是什么?
和
这个也有段错误
int *p;
*p = 5;
cout << *p << endl;
也会引发段错误。 我对上述代码的理解是,我声明了一个指向int的指针,并且正在将一个整数值分配给一个指向整数的已取消引用的指针,但是由于未初始化该变量,因此编译器尚未在堆栈上分配内存。用于存储值(有点像悬空指针行为?)如果是原因,为什么会引发分段错误,该错误的原因是访问程序无法访问的内存?
谢谢。
为什么它在编译时没有显示不兼容的类型错误,而不是给出分段错误?
因为类型是兼容的。 *p
是int
类型, 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.