Когда вы объявляете
int* a;
Вы объявляете переменную указателя a
, но не указываете на что-либо.Затем в функции вы делаете
*a = x;
, который разыменовывает указатель и пытается присвоить тому, на что он указывает, значение x
.Но так как он ни на что не указывает, вы получаете неопределенное поведение, проявляющееся в ошибке сегментации.
Вы должны сделать это:
int i; // the actual integer variable
int* a = &i; // a points to i
Разница между этим и первым -что int a;
объявляет вещественную целочисленную переменную, затем вы берете ее адрес с &a
и передаете ее функции.Указатель a
внутри функции foo
указывает на переменную a
в main
, поэтому его разыменование и присвоение ему вполне подходят.