2010-09-02 4 views
16

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

например.

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

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

ответ

33

Нет, память, выделенная с 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); 
} 
3

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

0

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

3

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

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

1

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

«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

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

Смежные вопросы