gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:26:26 25 4
gpt4 key购买 nike

我是 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;

关于为 cout 取消引用指针时的 C++ SegFault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19256975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com