c++ - 分段故障说明
问题描述
为什么A和B会导致分段错误。因为即使 x 没有被赋值,它在技术上仍然是一个垃圾值,对吧?另外,为什么 D 不是分段错误?我的答案键说 A 和 B 是分段错误,但这似乎是错误的。D 应该是有分段错误的那个,因为它试图返回 0。如果我错了,有人可以纠正我。
一种。
int x;
int* p = &x;
cout << p << *p << endl;
B.
int* p = new int;
cout << p << *p <<endl;
C。
int* p;
cout << p << *p <<endl;
D.
int* p = 0;
cout << p << *p <<endl;
解决方案
“即使 x 没有被赋值,它在技术上仍然是一个垃圾值,对吧?” -错了。它有一个不确定的值,读取它是 UB。
读取未初始化的变量是未定义的行为。不允许您这样做,并且这样做的结果是,整个程序是无效的,没有任何意义。另请参阅https://en.cppreference.com/w/cpp/language/ub
在您的示例中, A 是 UB,因为打印*p
读取的x
是未初始化的值。B 是 UB,因为int
指向的 byp
未初始化。C 是 UB,因为p
未初始化。D 是 UB 因为*p
取消引用 a nullptr
。
你所有的例子都是无效的代码,编译器可以生成它想要的任何结果,它不必告诉你你做错了什么。您有责任了解语言的所有规则并始终遵守它们。
其他推荐阅读材料:
推荐阅读
- ruby-on-rails - 覆盖 Rails 模型中的验证
- scala - 如何使用 net.ruippeixotog.scalascraper 从列表中抓取所有文本
- javascript - ember js中push和pushObject的区别
- python - 三元运算符的替代实现,一个衬里
- javascript - 如何从 Google Sheet 获取日期类型的 HTML 元素?
- liquibase - 有没有办法在运行时使用 Liquibase 将属性替换作为参数传递?请分享一个例子?
- python - python中的API请求和“进程以退出代码0完成”
- laravel - Laravel 查询以将 json 数据输出为选择列表。如何修改现有代码以连接两个值
- flutter - 如何使变量保持不变?
- javascript - 反应不保存勾选的复选框