Разве вы не можете реально c блок памяти в C изнутри функции? - PullRequest
0 голосов
/ 01 мая 2020

Итак, при написании программы я понял, что при использовании reallo c в функции вне main, если исходный блок памяти был объявлен в main, похоже, что изменения не сохраняются вне функции. EG

void main()
{

    int *ptr;

    //allocates memory
    ptr = calloc(4, sizeof(int));

    exampleFunction(&ptr);

} //end main


//this function reallocates the memory block of ptr
void exampleFunction(int *ptr)
{

    ptr = realloc(ptr, (sizeof(int) * 10));

} // end exampleFunction

Нужно ли делать что-то другое или это должно работать нормально? Также это только пример кода и не предназначен для запуска

Дополнительная информация Я использую MinGW на windows 10

Ответы [ 2 ]

2 голосов
/ 01 мая 2020

Вы передаете функции выражение &ptr, которое имеет тип int **.

exampleFunction(&ptr);

Но параметр функции имеет тип int *.

void exampleFunction(int *ptr)

Таким образом, объявление функции и ее вызов не имеют смысла.

Вы должны объявить и определить функцию, по крайней мере, как

//this function reallocates the memory block of ptr
void exampleFunction( int **ptr)
{

    *ptr = realloc( *ptr, (sizeof(int) * 10));

}

Хотя будет лучше использовать временный указатель с вызов realloc, потому что функция может вернуть NULL. В этом случае первоначальное значение *ptr будет потеряно.

Поэтому вы должны объявить функцию как

//this function reallocates the memory block of ptr
int exampleFunction( int **ptr)
{
    int *tmp = realloc( *ptr, (sizeof(int) * 10));

    int success = tmp != NULL;

    if ( success ) *ptr = tmp;

    return success;

}
0 голосов
/ 01 мая 2020

Вы можете написать так.

void main()
{

    int *ptr;

    //allocates memory
    ptr = calloc(4, sizeof(int));

   ptr= exampleFunction(ptr);

}

int * exampleFunction(int *ptr)
{
    ptr = realloc(ptr, (sizeof(int) * 10));
  return(ptr);
}
...