2014-02-03 3 views
0

Я имею структуру, которая включает в себя множество других структур:Динамический элемент массива вложенной структуры

typedef struct{ 
    int cell_Type;  //user association: 0--> Macro 1--> Femto 
    int cell_ID;  //cell ID that the user is associated with 
}association; 

//User struct 
typedef struct{ 
    coord c;    //coordinates 
    association id;    //association parameters 
    capacity cap;    //capacity parameters 
}usu; 

//Struct with a vector of users 
typedef struct{ 
    usu user[NUM_USERS+NUM_HS]; //each user is defined by the association (id), etc... 
}vectusers; 

void main(int argc,char *argv[]) 
{ 
     //..... 

     //memory allocation for the structures 
     users_ptr=calloc(1,sizeof(vectusers)); //users pointer 

     //..... 
} 

До сих пор так хорошо, до этого момента, что было необходимо для массива, который я не будет знать его размер, пока программа почти не закончится.

Таким образом, структура будет:

typedef struct{ 
    int cell_Type;  //user association: 0--> Macro 1--> Femto 
    int cell_ID;  //cell ID that the user is associated with 
    int assigned_RBs; //counter of how many resources have been assigned 
    int *RB_number;  //array with size according to assigned_RBs counter 
}association; 

Моя проблема с таНос() и перераспределить(). На самом деле я думаю, что я резервирование правильно памяти с таНосом:

users_ptr->user[u].id.RB_number = malloc(1*sizeof(int)); 

, но когда дело доходит до перераспределить(), я не изменить размер массива:

users_ptr->user[index_max_W].id.assigned_RBs++; 

size = users_ptr->user[index_max_W].id.assigned_RBs; 

users_ptr->user[index_max_W].id.RB_number = realloc((users_ptr->user[index_max_W].id.RB_number),size); 

где index_max_w является индекс пользователя с максимальным значением статистики. Оба размера и index_max_W были объявлены как int.

Может кто-нибудь, пожалуйста, помогите мне с realoc в этом случае?

+1

Непонятно, в чем дело. Что вы подразумеваете под «но когда дело доходит до realloc(), я не изменяю размер массива:« – hivert

+0

В начале массив имеет только одну запись, которая будет [0]. После некоторого выполнения я хочу, чтобы в третьем примере было больше записей, согласно некоторым статистическим данным. Это будет изменение в соответствии с assigne_RBs. – kat

+0

Если этот код должен компилироваться и запускаться в среде размещения (такой как Windows, Linux, телефоны и т. Д.), Тогда main должен возвращать 'int'. – Lundin

ответ

1

Аргумент размера realloc() находится в байтах, как и аргумент malloc(). Ваш код, похоже, не учитывает масштабирование для realloc(), что приведет к (резкому) недораспределению и, таким образом, неопределенному поведению при доступе к памяти.

Это должно быть что-то вроде:

const size_t new_size = users_ptr->user[index_max_W].id.assigned_RBs; 

users_ptr->user[index_max_W].id.RB_number = realloc(users_ptr->user[index_max_W].id.RB_number, 
new_size * sizeof *users_ptr->user[index_max_W].id.RB_number); 

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

+0

Благодарю за ваш ответ. Я пытаюсь таким образом, но все же это не работает. – kat

+0

Я изменил realloc(), как в первом предположении, однако переменный размер у меня есть как int. Таким образом, он работает отлично. – kat

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