Ошибка сегментирования вывода порядка объявления указателей C ++ или ошибка шины

Это будет два вопроса в одном

У меня есть две части кода, единственное отличие состоит в порядке между объявлением int * a; и int cpt = 0; по строкам 6 и 7.

Случай 1:

#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

Случай 2:

#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

Мне интересно, почему порядок декларации влияет на ошибку. Переменная cpt нигде не используется, так почему ее объявление влияет на ошибку?

Мне также интересно, почему указатель «а» во втором случае не вызывает segfault при обращении к нему, когда указатель «b» создает segfault. Они имеют одинаковую декларацию и одинаковое использование, почему разница?

Спасибо!

1

Решение

Ключ в том, что вы делаете (разыменование неинициализированного указателя) приводит к неопределенное поведение, так что вы действительно не можете ожидать что-нибудь в частности, не произойдет, и нет разумного / «стандартно-совместимого» объяснения того, что делает программа. Однако может случиться так, что стек настроен так, что во втором случае a случайно указывает на правильную ячейку памяти, но это только предположение.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]