c++ - 为什么未初始化的指针可以访问类成员?
问题描述
class C {
public:
C(int x):
_x(x){}
void print(){
std::cout<<_x<<std::endl;
}
int _x;
};
int main(){
C* c;
c->print(); // print 0 !
return 0;
}
c 是 C 类型的指针,但它没有指向任何东西!那么为什么c->print()
有效呢?
例如,如果我尝试
int* p;
我无法编译,因为我试图指向任何内容并且编译器阻止了我。
我应该使用
int* p = nullptr;
或指向给定的参考。它应该与定义的类型 C 相同吗?而不是 'int' 我使用 'C' 那么为什么不同的结果呢?
解决方案
您的程序具有未定义的行为。这意味着您做了一些非法的事情(通过未初始化的指针间接),但编译器不需要捕获它,并且程序可能在运行时看起来可以工作,但这种行为永远无法保证。
推荐阅读
- javascript - 在 NOSQL 数据库中存储 HTML?
- flutter - 如何在 Flutter 的 App bar 内添加 texfield?
- mediawiki - 生成输入字符串的加密哈希值的 Mediawiki 扩展?
- php - 在列表中查找特定数字并回显包含该数字的行
- javascript - D3.js 无法更新组中的现有元素
- postgresql - 在 PostgreSQL 9.4 上计算两个小时之间的差异
- android - 在 Firestore 事务中更新同一文档的多个字段时的定价
- excel - 获取过滤后的 ListObject 的使用范围
- common-lisp - 在调试器中,我们可以让 `q` 选择给定的重启吗?
- python - 在 Visual Studio 中运行 Python 代码 - 安装 pip 不起作用