c++ - 理解 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 的指针,并且我将一个整数值分配给一个取消引用的指向整数的指针,但是由于变量没有初始化,编译器没有在堆栈上分配内存用于存储值(类似于悬空指针行为?)如果这是原因,为什么会引发分段错误,该错误的原因是访问程序无法访问的内存?
- 如果一个变量只声明而不初始化,编译器是否会完全忽略变量名并将其视为不存在的变量名?
谢谢你。
解决方案
为什么它在编译时没有显示不兼容的类型错误而不是给出分段错误?
因为类型是兼容的。*p
是类型的int
,var
也是类型的int
。您在这里处理的是运行时的问题,而不是编译时的问题。
程序试图做什么会导致分段错误,以及如何?
*
运算符取消引用一个指针。这意味着,获取该指针的地址并检索该地址处的内容。
在您的错误情况下,您未初始化指针。因此,取消引用操作失败,因为所引用的地址是不确定的。
如果一个变量只声明而不初始化,编译器是否会完全忽略变量名并将其视为不存在的变量名?
一点也不。声明将名称引入特定范围。在您的示例中,您有定义:它们告诉编译器为它们分配一定数量的空间。
推荐阅读
- python - 如何更准确地逼近一组点?
- applescript - Applescript Mail - 脚本不会通过''对规则 theRule 的消息执行邮件操作'
- java - 在 CalenderView 中更改特定日期的背景颜色
- go - for 循环中的 Go 引用设置了错误的引用
- javascript - 无法从特定的 div 中获取 ID 和值
- laravel - 在 Laravel 6 刀片视图中显示用户的本地时间而不是服务器 UTC 时间
- javascript - 为什么我不能在 javascript 中对嵌套对象使用过滤器?
- d3.js - 使用 Plotly.js 限制形状的拖动区域
- javascript - 未捕获的 SyntaxError:const 声明中缺少初始化程序
- swift - 指定stackview的arrangedSubviews之间的不同间距