C указатель цепочки вызовов - PullRequest
0 голосов
/ 09 апреля 2020

Я хочу использовать указатель, который ссылается на кучу памяти (выделена функция mallo c). Я должен освободить память.

    for (int i = 0;i < yk->m;i++){
        Coords range = {0,-1};
        Coords ykc = {0,i};
        set_m(yk,ykc,sum_i(dot_times_m(yv,matrix_pow(xv,i)),0,range));
    }

, как и в приведенном выше коде, dot_times_m - это функция, которая возвращает указатель, выделенный mallo c. Но из-за отсутствия переменной для ссылки на указатель, я не могу ее освободить.

1 Ответ

1 голос
/ 09 апреля 2020

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

Пример:

for ( int i = 0; i < yk->m; i++ )
{
    Coords range = {0,-1};
    Coords ykc = {0,i};

    p = dot_times_m( yv, matrix_pow(xv, i) );   // assign the result to p
    set_m( yk, ykc, sum_i(p, 0, range) );       // use p in this call
    free( p );                                  // free p after use
}

Другим способом может быть непосредственное использование этого назначения указателя в вызов цепочки, а затем освободить указатель следующим образом:

for ( int i = 0; i < yk->m; i++ )
{
    Coords range = {0,-1};
    Coords ykc = {0,i};

    set_m( yk, ykc, sum_i( p = dot_times_m( yv, matrix_pow(xv, i) ), 0, range) );
    //                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    free( p );
}

Но в этом случае вы бы пожертвовали читабельностью!

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