Область применения malloc, используемая в функции - PullRequest
18 голосов
/ 02 сентября 2010

Когда функция возвращается, освобождается ли память через malloc?Или же он по-прежнему доступен в функции main () с помощью указателей?

например.

void function(int *a)
{
    a=(int *)malloc(sizeof(int));
    *a=10;
}
int main()
{
    int *num;
    function(num);
    printf("%d",*num);
    return(0);
}

Может ли целое число, хранящееся в a, быть доступным через main () здесь?

Ответы [ 6 ]

36 голосов
/ 02 сентября 2010

Нет, память, выделенная с помощью malloc, не освобождается при выходе из области действия / возврата из функции.

Вы отвечаете за освобождение памяти, которую вы используете malloc.

В вашем случаетем не менее, память недоступна в main (), но это потому, что вы имеете дело только с локальной переменной.

void function(int *a)
{
    a=(int *)malloc(sizeof(int));

Здесь a - локальная переменная в function.Указатели передаются по значению в C, поэтому a получает копию указателя в main, когда вы не выполняете function(num); main () не видит, что вы назначаете эту локальную копию указателя.

Youдолжны сделать либо:

void function(int **a)
{
  *a= malloc(sizeof(int));
  **a=10;
}
int main()
{
  int *num;
  function(&num);
  printf("%d",*num);
  free(num);
  return(0);
}

или

int* function(void)
{
  int *a= malloc(sizeof(int));
  *a=10;
  return a;
}
int main()
{
  int *num;
  num = function();
  printf("%d",*num);
  free(num);
  return(0);
}
3 голосов
/ 02 сентября 2010

Нет.Вы передаете указатель num по значению, следовательно, изменения, сделанные function, не будут отражены в main.Таким образом, фактически невозможно получить доступ / освободить выделенную память из main

. Чтобы исправить это, вы можете передать адрес num или вернуть a из функции и собрать возвращенное значение в num

3 голосов
/ 02 сентября 2010

malloc() ed память освобождается только при вызове на нее free().К нему может обратиться любой, у кого есть действительный указатель до этого времени.

1 голос
/ 02 сентября 2010

malloc работает нормально (хотя вам придется вызывать free () для указателя, который он возвращает).Проблема в том, что вы не возвращаете указатель на выделенную память.

"int * a", ваш параметр функции () является адресом целого числа.Обычный способ вернуть это было бы переписать вашу функцию следующим образом:

int * function()
{
  int * a = (int *)malloc(sizeof(int));
  *a = 10;
  return a;
}

Чтобы вернуть его через параметр, вам нужно вернуть адрес указателя:

//  pp points to a pointer
void function( int ** pp )
{
    //  Assign allocated memory to the thing that pp points to
    *pp = (int *)malloc( sizeof( int ) );

    //  Get the thing pp points to -- a pointer.
    //  Then get the thing which THAT pointer points to -- an integer
    //  Assign 10 to that integer. 
    **pp = 10;
}

void main()
{
    int * p = NULL;

    function( & p );

    printf( "%d\n", *p );

    free( p );
}

И теперь вы знаете, почему они изобрели C #.

Вот способ переписать вашу вещь выделения, чтобы было понятнее:

void function( int ** pp )
{
    int * newmemory = (int *)malloc( sizeof( int ) );

    //  Assign 10 to the integer-sized piece of memory we just allocated. 
    *newmemory = 10;

    //  Assign allocated memory to the thing that pp points to. 
    *pp = newmemory;
}
0 голосов
/ 29 ноября 2011

Вы можете сохранить прямой адрес выделенной памяти в контейнере списка, затем создать функцию для зацикливания, получить доступ к каждому адресу в свободной функции и затем вывести адрес. Вы можете вставить адрес непосредственно в бесплатную функцию, например free(myaddresslist.front()); myaddresslist.pop_front();. Это квази-способ сделать вашу собственную сборку мусора без необходимости менять весь ваш проект на языки, основанные на GC. Используйте myaddresslist.size(), чтобы убедиться, что вы не вызываете free () для пустого поля (что приводит к сбою), и для определения количества циклов, которые нужно выполнить.

0 голосов
/ 02 сентября 2010

Память не освобождена. Любая функция может выделить память, а любая другая - освободить ее. Это настоящий беспорядок, если вы не супер привередливы, пока ... кто-то не изобрел Сборку мусора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...