Подтвердить что ты не робот

Область применения malloc в функции

Когда функция возвращается, выделяется ли память через 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() здесь?

4b9b3361

Ответ 1

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

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

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

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

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

Вы должны сделать это:

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);
}

Ответ 2

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

Ответ 3

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

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

Ответ 4

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 );
}

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

Здесь вы можете переписать свой объект размещения, чтобы он стал более понятным:

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;
}

Ответ 5

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

Ответ 6

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