我是 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(使用前将#替换为@)