C++指针声明顺序输出分割错误或总线错误

C++指针声明顺序输出分割错误或总线错误,c++,pointers,segmentation-fault,bus-error,C++,Pointers,Segmentation Fault,Bus Error,这将是一个两个问题 我有两段代码,唯一的区别是int*a声明之间的顺序;int-cpt=0;在第6行和第7行 案例1: 案例2: 我想知道为什么声明顺序会影响错误。cpt变量没有在任何地方使用,那么为什么它的声明会影响错误呢 我还想知道为什么第二种情况下的指针a在引用它时不产生segfault,而b指针却产生segfault。它们有相同的声明和用法,为什么不同 谢谢 关键是你在做什么取消对未初始化指针的引用会导致未定义的行为,因此你真的不能期望任何特别的事情发生,也没有一个合理/标准的解释来解释

这将是一个两个问题

我有两段代码,唯一的区别是int*a声明之间的顺序;int-cpt=0;在第6行和第7行

案例1:

案例2:

我想知道为什么声明顺序会影响错误。cpt变量没有在任何地方使用,那么为什么它的声明会影响错误呢

我还想知道为什么第二种情况下的指针a在引用它时不产生segfault,而b指针却产生segfault。它们有相同的声明和用法,为什么不同


谢谢

关键是你在做什么取消对未初始化指针的引用会导致未定义的行为,因此你真的不能期望任何特别的事情发生,也没有一个合理/标准的解释来解释程序的行为。然而,在第二种情况下,堆栈的设置方式可能是a意外指向有效的内存位置,但这只是猜测。

关键是你正在做什么取消对未初始化指针的引用会导致未定义的行为,所以你真的不能期望任何特别的事情发生,对于程序的功能也没有合理/标准一致的解释。但是,在第二种情况下,堆栈的设置方式可能是a意外指向有效的内存位置,但这只是猜测。

而猜测实际上是您在这里所能做的一切,它是未定义的。我同意这一点,问题是,当执行同一代码时,事故会一次又一次地重复。像这样持续不断的事故似乎是标准不?a指针总是初始化的,不会产生SEGFULT,而b指针总是产生SEGFULT。@Sam不,只是您的操作系统在为您的进程重用相同的内存区域/分配模式…@Sam,通常,当然,如果不对代码进行任何更改,只是在同一平台上反复运行代码,那么未定义的行为是相当一致的。没有太多的变化会在逻辑上把事情搞砸,但请记住,将未定义的行为建立在逻辑基础上永远不会起作用。在大多数情况下,当重新运行它时,它通常是相同的,但总是有一个非常开放的可能性去做其他事情。@H2C03有不同的地址?这里你能做的就是猜测,它是未定义的。我同意这一点,问题是,当执行同一代码时,事故会一次又一次地重复。像这样持续不断的事故似乎是标准不?a指针总是初始化的,不会产生SEGFULT,而b指针总是产生SEGFULT。@Sam不,只是您的操作系统在为您的进程重用相同的内存区域/分配模式…@Sam,通常,当然,如果不对代码进行任何更改,只是在同一平台上反复运行代码,那么未定义的行为是相当一致的。没有太多的变化会在逻辑上把事情搞砸,但请记住,将未定义的行为建立在逻辑基础上永远不会起作用。在大多数情况下,当重新运行它时,它可能通常是相同的,但总是有一个非常开放的可能性去做其他事情。@H2C03有不同的地址?
#include <iostream>
using namespace std;
int main()
{
    cout<<"begin"<<endl;
    int* a;
    int cpt = 0;
    cout<<"after init "<<a<<endl;
    *a = 2;
    cout<<"after assign"<<endl;
    cout<<a<<" "<<*a<<endl;
    cout<<"after cout"<<endl;
    int* b;
    *b = 2;
    cout<<b<<" "<<*b<<endl;
}
begin
after init 0x7fff6c97f05e
Bus error: 10
#include <iostream>
using namespace std;
int main()
{
    cout<<"begin"<<endl;
    int cpt = 0;
    int* a;
    cout<<"after init "<<a<<endl;
    *a = 2;
    cout<<"after assign"<<endl;
    cout<<a<<" "<<*a<<endl;
    cout<<"after cout"<<endl;
    int* b;
    *b = 2;
    cout<<b<<" "<<*b<<endl;
}
begin
after init 0x7fff50e4ac00
after assign
0x7fff50e4ac00 2
after cout
Segmentation fault: 11