передача указателя в качестве аргумента функции в C - PullRequest
1 голос
/ 27 февраля 2012

Что-то, на что я наткнулся и заставило меня задуматься.Почему это работает?

void foo (int* a)
{
    int x = 3;
    *a = x;
}

int main()
{
    int a;
    foo(&a);
    return 0;
}

Но это вызывает ошибку сегментации (как в Visual Studio 2008, так и в gcc)?

void foo (int* a)
{
    int x = 3;
    *a = x;
}

int main()
{
    int* a;
    foo(a);
    return 0;
}

Это что-то определенное в языке или просто реализациявопрос

Ответы [ 2 ]

4 голосов
/ 27 февраля 2012

Когда вы объявляете

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, поэтому его разыменование и присвоение ему вполне подходят.

2 голосов
/ 27 февраля 2012
int a;

Назначает память, как только вы объявляете ее, но это не так с int * a;

int *a; 

- объявление указателя (ПАМЯТЬ еще не выделено для этого).

int *a = (int*)malloc(sizeof(int)); // allocate memory
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...