2013-03-21 2 views
0

Я пишу код, в котором есть несколько функций. В каждой функции есть несколько переменных, для которых память должна быть распределена динамически. Функции вызываются многократно, поэтому логично выделять память один раз и освобождать ее в конце main.Свободная динамически распределенная память, определяемая ключевым словом static в C

main функция выглядит следующим образом:

//Some code here 
while (err < tolerance){ 
     CalculateMismatch(M, err); 
     //Update M and err and do other things 
} 
//Here is end of main, where I should free all the memories being allocated dynamically in other functions 

Этот код показывает, что CalculateMismatch называется несколько раз. Итак, я просто выделяю память один раз в этой функции. Что-то вроде этого:

function CalculateMismatch(Some arguments){ 
     //The following line is illegal in C, but I do not know how to allocate the memory just once and reuse it several times. 
     static double *variable1 = malloc(lengthofVar1 * sizeof(variable1)); 
     //Rest of the code 
} 

Моя проблема заключается в том, что я не знаю, как получить доступ к переменным, определенным в CalculateMismatch в main. Пожалуйста, дайте мне знать, как я должен освобождать переменные или нет или нет более эффективного способа выделения и освобождения памяти. Спасибо за вашу помощь заранее.

Чтобы предоставить более подробную информацию о моем коде: До сих пор я определял все переменные глобально и динамически выделял память в основном. Но так как число переменных велико, а некоторые из них используются только в одной конкретной функции, я решил переместить определение внутри функций. Но я не знаю, как освободить память, выделенную внутри каждой функции.

+1

Это C или C++? В каждом случае ответ будет очень разным. –

+0

У вас не может быть статическая переменная, инициализированная с помощью 'malloc' в C. – teppic

+0

Я пишу код в C. – Pouya

ответ

0

Вы не можете получить доступ к переменным, объявленным в CalculateMismatch из main. Если вам нужно, вам придется переместить декларации из CalculateMismatch (например, для основного), а затем передать их в CalculateMismatch в качестве параметров.

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

EDIT

Вы должны переместить декларацию variable1 к основному. Затем передайте его в значение CalculateMismatch.

int main() 
{ 
    double *variable1 = malloc(...); 
    ... 
    while (...) 
    { 
     CalculateMismatch(..., variable1); 
    } 
    ... 
    free(variable1); 
} 
2

Это неверно:

static double *variable1 = malloc(lengthofVar1 * sizeof(variable1)); 

вы, вероятно, хотите:

static double *variable1 = malloc(lengthofVar1 * sizeof(*variable1)); 

К сожалению, нет никакого способа, которым вы можете освободить эту переменную из вне функции, если вы делаете что-то передайте его обратно.

Нет прямого тривиального решения. Одним из решений было бы, конечно, чтобы переместить переменную из шага:

static double *variable1 = 0; 

function CalculateMismatch(Some arguments){ 

    if (!variable1) variable1 = malloc(lengthofVar1 * sizeof(*variable1)); 

     //Rest of the code 
} 

... 
int main(...) 
{ 
    ... 

    free(variable1); 
} 
0

Если вы хотите получить доступ к динамически выделенной памяти из нескольких функций, но не хотите передавать указатели в качестве параметров, а затем объявить указатель на файл объем (глобальный). После объявления вы можете инициализировать его до того, как он понадобится с malloc, а затем каждая функция сможет получить доступ к памяти. В противном случае просто передайте указатель (ов) каждой функции, которая должна получить доступ к памяти, которую вы можете использовать до тех пор, пока не получите free.

Статическая переменная внутри функции в C - это та, которая сохраняет свое значение в функциональных вызовах и инициализируется до запуска вашей программы, поэтому вы не можете инициализировать ее с помощью malloc.

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