есть пара функций, одна определяет число элементов
вторая возвращает их по одному (проинициалировав 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: только С. запутался с malloc/free и указателями
Здравствуйте, 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[2]: только С. запутался с malloc/free и указателями
Здравствуйте, 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 и указателями
Здравствуйте, 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;
}
Re[2]: только С. запутался с malloc/free и указателями