Re: только С. запутался с malloc/free и указателями
От: Were  
Дата: 08.03.09 12:49
Оценка: 4 (1)
Здравствуйте, vav, Вы писали:

vav>при выполнении ругается, что память портится..

vav>а по моему разумению, должно быть именно так
vav>где прокололся? так же приветствуются комментарии на сколько все криво.

Видимо запутался в обилии указателей )

void load(elementsStruct ***arr, int * cnt)
{
    *cnt = GetElementsCount();
    *arr = (elementsStruct **)malloc(*cnt*sizeof(elementsStruct *));
    for (int i = 0; i < *cnt; i++)
        (*arr)[i] = GetNext();
    return;
}

main()
{
    elementsStruct **arr1 = 0;
    int cnt = 1;
    load(&arr1, &cnt);
    for (int i = 0; i < cnt; i++)
    {
        printf("print something from elementsStruct\n");
        free((void*)arr1[i]);
    }
    free((void *)arr1);
    return 0;
}

Всяческие проверки на null-pointer тоже не мешает вставить.
Re: только С. запутался с malloc/free и указателями
От: Андрей Тарасевич Беларусь  
Дата: 08.03.09 18:26
Оценка: 4 (1)
Здравствуйте, vav, Вы писали:

vav> так же приветствуются комментарии на сколько все криво.


Можно посоветовать перестать использовать имена типов где-либо, кроме объявлений (по-возможности, разумеется). В частности, прекратить бездумно лепить совершенно не нужные приведения типов на результат malloc, раз уж это Си, и избегать упоминаний типов в sizeof

/* Используя вариант Were */
void load(elementsStruct ***arr, int *cnt)
{
    *cnt = GetElementsCount();
    *arr = malloc(*cnt * sizeof **arr);
    for (int i = 0; i < *cnt; i++)
        (*arr)[i] = GetNext();
    return;
}


(Хвостовой return в void-функции — это, наверное, дело вкуса)
Best regards,
Андрей Тарасевич
Re: только С. запутался с malloc/free и указателями
От: ilnar Россия  
Дата: 08.03.09 19:44
Оценка: -1
Здравствуйте, vav, Вы писали:

vav>есть пара функций, одна определяет число элементов

vav>вторая возвращает их по одному (проинициалировав malloc-ом)
vav>
vav>    extern int GetElementsCount()(void);
vav>    extern elementsStruct* GetNext(void);
vav>


я надеюсь, функция GetNext(); reentrant, судя про free в free((void*)arr1[i]); — да

vav>
vav>void load(elementsStruct **arr, int * cnt)
vav>{
vav>    *cnt = GetElementsCount();
vav>    *arr = (elementsStruct *)malloc(*cnt*sizeof(elementsStruct *));
vav>    for (int i = 0; i < *cnt; i++)
vav>        arr[i] = GetNext(); // одна ошибка здесь, надо (*arr)[i] = GetNext();
vav>    return;
vav>}

vav>main()
vav>{
vav>    elementsStruct *arr1 = NULL; // тут сразу правлю, тоже нехорошее было
vav>    int cnt = 1;
vav>    load(&arr1, &cnt); // тут добавил &
vav>    for (int i = 0; i < cnt; i++)
vav>    {
vav>        printf("print something from elementsStruct\n");
vav>        free((void*)arr1[i]); // теперь после *arr1 = NULL и &arr1 это стало нормально, иначе пришлось бы писать тут free((*arr)[i]);  и еще, кстати, к void * все неконстантные и другие неспецифичные указатели приводятся сами, без (void*)
vav>    }
vav>    free((void *)*arr1);
vav>    free((void *)arr1); // это после *arr1 = NULL становится лишним
vav>    return 0;
vav>}
vav>


vav>при выполнении ругается, что память портится..

vav>а по моему разумению, должно быть именно так
vav>где прокололся? так же приветствуются комментарии на сколько все криво.


кстати cnt можно было бы возвращать ретурном из load
еще одно кстати, тут несколько чещей из того что только С++ компилятор считает нормальным
итог :

int load(elementsStruct **arr)
{
    int cnt = GetElementsCount();
    *arr = (elementsStruct *)malloc(cnt*sizeof(elementsStruct *));
    for (int i = 0; i < cnt; i++)
        (*arr)[i] = GetNext();
    return cnt;
}

main()
{
    elementsStruct *arr1 = NULL;
    int cnt = load(&arr1);
    for (int i = 0; i < cnt; i++)
    {
        printf("print something from elementsStruct\n");
        free(arr1[i]);
    }
    free(arr1);
    return 0;
}
только С. запутался с malloc/free и указателями
От: vav Россия  
Дата: 08.03.09 11:22
Оценка:
есть пара функций, одна определяет число элементов
вторая возвращает их по одному (проинициалировав malloc-ом)
    extern int GetElementsCount()(void);
    extern elementsStruct* GetNext(void);



void load(elementsStruct **arr, int * cnt)
{
    *cnt = GetElementsCount();
    *arr = (elementsStruct *)malloc(*cnt*sizeof(elementsStruct *));
    for (int i = 0; i < *cnt; i++)
        arr[i] = GetNext();
    return;
}

main()
{
    elementsStruct **arr1 = (elementsStruct **)malloc(sizeof(elementsStruct *));
    int cnt = 1;
    load(arr1, &cnt);
    for (int i = 0; i < cnt; i++)
    {
        printf("print something from elementsStruct\n");
        free((void*)arr1[i]);
    }
    free((void *)*arr1);
    free((void *)arr1);
    return 0;
}


при выполнении ругается, что память портится..
а по моему разумению, должно быть именно так
где прокололся? так же приветствуются комментарии на сколько все криво.
Re[2]: только С. запутался с malloc/free и указателями
От: vav Россия  
Дата: 08.03.09 16:41
Оценка:
Здравствуйте, Were, Вы писали:

Точно! спасибо.

W>Всяческие проверки на null-pointer тоже не мешает вставить.


Ну это само сабой.. я наоборот пример разгружал, чтобы взглядом охватывался.
Re[2]: только С. запутался с malloc/free и указателями
От: ilnar Россия  
Дата: 09.03.09 08:34
Оценка:
извините, ошибки, исправляю


int load(elementsStruct ***arr)
{
    int cnt = GetElementsCount();
    *arr = (elementsStruct *)malloc(cnt*sizeof(elementsStruct *));
    for (int i = 0; i < cnt; i++)
        (*arr)[i] = GetNext();
    return cnt;
}

main()
{
    elementsStruct **arr1 = NULL;
    int cnt = load(&arr1);
    for (int i = 0; i < cnt; i++)
    {
        printf("print something from elementsStruct\n");
        free(arr1[i]);
    }
    free(arr1);
    return 0;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.