取消引用 cout 指针时的 C++ SegFault

2023-12-22

我是 C++ 新手,只是想掌握它。通常看起来还不错,但我偶然发现了这种奇怪/病态的段错误行为:

int main () {
  int* b;
  *b = 27;
  int c = *b;
  cout << "c points to " << c << endl; //OK                                                                                                                                      
  printf( "b points to %d\n", *b); //OK                                                                                                                                          
  // cout << "b points to " << (*b) << endl; - Not OK: segfaults!                                                                                                               
  return 0;
}

正如所给出的,该程序会产生您所期望的结果:

c points to 27
b points to 27

另一方面,如果取消倒数第二行的注释,则会得到一个在运行时崩溃(段错误)的程序。为什么?这是一个有效的指针。


int* b指向未知的内存地址,因为它尚未初始化。如果您将其初始化为编译器存在的任何空指针值(0直到 C++11,nullptr在 C++11 及更高版本中),您肯定会更早地遇到段错误。问题在于您为指针分配了空间,但没有为它指向的数据分配空间。如果你这样做:

int c = 27;
int* b = &c;

cout << "c points to " << c << endl;
printf ("b points to %d\n", *b);
cout << "b points to " << (*b) << endl;

事情会成功,因为int* b指的是程序可以访问的内存位置(因为内存实际上是程序的一部分)。

如果您未初始化指针或为其分配空值,则在它指向您知道可以访问的内存地址之前,您将无法使用它。例如,使用动态分配new操作员将为您保留数据的内存:

int* b = new int();
*b = 27;
int c = *b;

//output

delete b;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

取消引用 cout 指针时的 C++ SegFault 的相关文章

随机推荐

  • 如何让内容占据100%的高度和宽度

    我已经很接近了 但我无法让它像我想要的那样工作 我试图让标题和菜单始终可见 并使内容占据视图屏幕的其余部分 并在溢出时拥有自己的滚动条 问题是内容的宽度没有被拉伸到右侧 并且我在页面中间出现了一个滚动条 我也无法让它占据剩余窗口高度的其余部
  • 智能指针作为多态性的类成员

    我是智能指针的新手 如果有人能给我提示我作为类成员处理智能指针的方式是否正确 我将非常感激 更准确地说 我想要实现的解决方案是在类多态性的背景下实现的 并且理想情况下应该是异常安全的 Given a 异构对象的容器 http www par
  • 来自 BLL 中的一种方法的跨多个 DAL 方法的事务

    您将如何从业务逻辑层中的一个方法调用数据访问层中的多个方法 以便所有 SQL 命令都存在于一个 SQL 事务中 每个 DAL 方法都可以从 BLL 中的其他位置单独调用 因此不能保证数据层方法始终是事务的一部分 我们需要此功能 因此如果数据
  • @StringRes、@DrawableRes、@LayoutRes等android注解lint检查与kotlin参数

    假设您有这样的带有默认参数的数据类 data class Info DrawableRes val iconRes Int 0 StringRes val stringRes Int 0 LayoutRes val layoutRes In
  • 无法解析符号“RequestQueue”

    我是 android studio 和 volley 库的新手 所以请耐心等待 我通过 GitHub 添加了 volley 库 然后添加了这一行来构建 gradle 文件 compile com android support appcom
  • 查找对象数组中最后一个匹配的对象

    我有一系列对象 我需要获取最后一个对象的对象类型 本例中为 形状 将其删除 然后找到数组中具有相同类型的前一个对象的索引 例如 形状 var fruits shape round name orange shape round name a
  • JSP中页面

    我收到了一项向 HTML 页面 JSP 添加功能的任务 该页面仅来自设计师 前端开发人员 因此在某些地方我需要更改a href to button or input但这会造成混乱 所有设计都改变了 这是一段代码 div class col
  • 如何绘制三列数据的热图

    我有三列文件 500 万行 它像是 x y z 3 4 6 7 9 4 7 8 X 和 y 是像素编号 z 是 x y 处的对应值如何绘制热图 二维图是我最初想法的妥协 你可以查看我的原帖如何使用 scipy interpolate 中的
  • 去打印大量

    我目前正在做 Go Lang 教程 准确地说是 数字常量 示例代码以以下语句开头 const Create a huge number by shifting a 1 bit left 100 places In other words t
  • 使用here()函数向上一级目录

    我想让这里的函数在开始下降目录级别之前上升一个级别 例如 我的项目位于目录 parent project root 中 因此here 将此视为默认目录 我想在 parent other dir 中读取一些数据 我需要传递什么参数到here
  • Elasticsearch:嵌套查询中的脚本字段

    有没有办法在嵌套查询中使用 script fields 将字段添加到返回的inner hits 例子 nested inner hits path companies score mode sum query script fields o
  • joblib中的batch_size和pre_dispatch到底是什么意思

    从这里的文档https pythonhosted org joblib parallel html parallel reference documentation https pythonhosted org joblib paralle
  • 编译器会优化转义内循环吗?

    我的代码如下所示 显示了完成的所有用法 bool done false for int i 0 i lt big i for int j 0 j lt wow j if foo i j done true break if done bre
  • TinyIoC:在单个实例上注册多个接口

    Autofac 允许使用 AsImplementedInterfaces 或链式 As 调用与 SingleInstance 轻松地将多个接口解析为同一实例 这也可以用 TinyIoC 来完成吗 我只找到了如何注册同一接口的多个实现 但没有
  • 持久存储的核心数据错误

    我正在尝试使用核心数据从模型加载简单数据并将其放入表视图中 这是我的持久存储的以下代码 AppDelegate m NSPersistentStoreCoordinator persistentStoreCoordinator if per
  • 返回 JSF 页面上的图像列表

    我有一个用户可以从中选择的项目的下拉列表 视图是 JSF 我希望在用户从下拉列表中选择一个项目后 图像出现在同一个 JSF 页面上 即用户从下拉列表中选择单词 Cat 并且出现一组不同的猫图像 我该如何在 JSF 中编写此代码 注意 我使用
  • 如何在 Bash 或 Unix shell 中检查字符串中的第一个字符?

    我正在 Unix 中编写一个脚本 其中我必须检查字符串中的第一个字符是否为 如果是 则分支 例如 我有一个字符串 some directory file 我希望它返回 1 并且 email protected cdn cgi l email
  • python selenium 检查此文本字段是否被禁用

    这是已从 UI 禁用的文本区域的 html 代码 div class ftnt input div
  • OpenShift 并在 .htaccess 中重定向

    我在 OpenShift 上部署了一个 Wordpress 应用程序并关联了一个域别名 即 www example org 现在我想添加另一个别名 即 www example2 org 并优雅地重定向来自 www example org g
  • 取消引用 cout 指针时的 C++ SegFault

    我是 C 新手 只是想掌握它 通常看起来还不错 但我偶然发现了这种奇怪 病态的段错误行为 int main int b b 27 int c b cout lt lt c points to lt lt c lt lt endl OK pr