你好 stackoverflow 社区,我正在研究 C++ 中的指针。我对 golang 和 python 有一点了解,但对 C 或 C++ 没有了解,所以请原谅我的理解有误。让我发布一段运行良好但出现段错误的代码。
- 1
这个打印 5
int var = 5;
int *p = &var;
cout << *p << endl;
- 2
这个也打印 5
int *p;
p = &var;
cout << *p << endl;
打印 5
(因为 p 是一个指向 int 的指针,而 var 的地址是一个指向 int 的指针。)。
但是,
- 3
这是一个段错误。
int *p;
*p = var;
cout << *p << endl;
我假设发生这种情况是因为我将一个整数变量分配给一个应该是指向整数的指针的变量。为什么它在编译时没有显示不兼容的类型错误而不是给出段错误?程序试图做什么会给出段错误,如何做?
和
- 4
这个也是段错误
int *p;
*p = 5;
cout << *p << endl;
也会抛出段错误。我对上面代码的理解是,我声明了一个指向 int 的指针,并且我将一个整数值分配给一个指向整数的取消引用指针,但是由于变量没有初始化,编译器没有分配堆栈上的内存用于存储值(类似于悬空指针行为?)如果这是原因,为什么它会抛出段错误,该错误的原因是访问程序无法访问的内存?
- 如果一个变量只被声明而没有被初始化,编译器是否会完全忽略变量名并将其视为不存在的变量名?
谢谢。
最佳答案
Why was it not showing incompatible type error at compile time rather than giving a segmentation fault?
因为类型兼容。 *p
是int
类型,var
也是int
类型。您在这里处理的是运行时的问题,而不是编译时的问题。
What is the program trying to do that is giving a segmentation fault, and how?
*
运算符取消对指针的引用。这意味着,获取该指针的地址并检索该地址的内容。
在您的错误案例中,您未初始化指针。因此,取消引用操作失败,因为引用的地址是不确定的。
If a variable is declared only and not initialized, does the compiler ignores the variable name totally and treats it as a non-existant variable name?
完全没有。声明将名称引入特定范围。在您的示例中,您有定义:它们告诉编译器为它们分配一定量的空间。
关于c++ - 了解 C++ 中的指针初始化行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50551409/