kasandra77 Ответов: 2

Как выделить память структуре в функции ?


у меня есть функция create_system в этой функции я хочу выделить память массиву с именем c_array, который является указателем на структуру Activity..
я понимаю, что то, как я пытался выделить память, неправильно ! я перепробовал все и добрался после поиска по всему Гуглу до такого способа выделения :
Activity* ((*sys)->c_array)=malloc(num_challenges * sizeof(Activity));

но я получаю следующую ошибку :
expected ')' before '->' token

любая помощь от того, что я делаю здесь неправильно ! Заранее спасибо

Что я уже пробовал:

typedef struct SRoomSystem
{
Activity *c_array;

} RoomSystem;
int num_challenges=6;//this is just an example
Result create_system(RoomSystem **sys){
   Activity* ((*sys)->c_array)=malloc(num_challenges * sizeof(Activity));
}

2 Ответов

Рейтинг:
15

Rick York

Попробуй

c_array = (Activity *)calloc( num_challenges, sizeof(Activity) );


Rick York

calloc-это просто malloc с двумя отличиями: он принимает два параметра, размер и количество, и обнуляет выделенную память.

kasandra77

я пробовал это как ты сказал :
((*. sys файла)-&ГТ;c_array) = (активности *)с памятью( num_challenges, оператор sizeof(деятельность) );
я думаю, это сработало ! я не могу проверить это наверняка сегодня(мне нужно поспать), но завтра я собираюсь проверить это !
большое вам спасибо

Рейтинг:
10

Jochen Arndt

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

Если у вас есть адрес *sys существующего RoomSystem структура:

sys->c_array = malloc(num_challenges * sizeof(Activity));

Если у вас есть функция с RoomSystem **sys параметр:
Result create_system(RoomSystem **sys)
{
    *sys->c_array = malloc(num_challenges * sizeof(Activity));
    /* Assuming RESULT_* are Result values */
    return (*sys->c_array == NULL) ? RESULT_NO_MEM : RESULT_OK;
}


kasandra77

о, большое вам спасибо !! один вопрос: если бы я сохранил активность*, я бы не смог сделать бесплатно memoty вне этой функции ?

Jochen Arndt

Если вы сохраните Acticity* у вас будет локальная переменная, и переданная структура не будет изменена.

Но вы можете использовать это вместо этого:

Activity *temp = malloc(num_challenges * sizeof(Activity));
*sys->c_array = temp;

kasandra77

хорошо, большое вам спасибо !!