Инициализация указателя в отдельной функции в C - PullRequest
15 голосов
/ 21 марта 2010

Мне нужно сделать простую вещь, которую я делал много раз в Java, но я застрял в C (чистый C, а не C ++). Ситуация выглядит так:

int *a;

void initArray( int *arr )
{
    arr = malloc( sizeof( int )  * SIZE );
}

int main()
{
    initArray( a );
    // a is NULL here! what to do?!
    return 0;
}

У меня есть некоторая «инициализирующая» функция, которая ДОЛЖНА присваивать данный указатель некоторым выделенным данным (не имеет значения). Как я должен дать указатель на функцию для того, чтобы этот указатель был изменен, а затем может быть использован дальше в коде (после того, как вызов функции вернется)?

Ответы [ 2 ]

25 голосов
/ 21 марта 2010

Вам нужно настроить * указатель, это означает, что вам нужно передать указатель на * a. Вы делаете это так:

int *a;

void initArray( int **arr )
{
    *arr = malloc( sizeof( int )  * SIZE );
}

int main()
{
    initArray( &a );
    return 0;
}
8 голосов
/ 21 марта 2010

Вы присваиваете arr побочное значение внутри initArray, поэтому любое изменение значения arr будет невидимым для внешнего мира. Вам нужно передать arr по указателю:

void initArray(int** arr) {
  // perform null-check, etc.
  *arr = malloc(SIZE*sizeof(int));
}
...
initArray(&a);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...