2016-07-11 3 views
-2

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

structName *allocate_memory(int *numPlayers,structName) 
{ 
    structName *retVal = malloc(sizeof(struct structName) * (*numPlayers)); 

    return retVal; 
} 

В Проблема в параметрах structName, что должно там идти? , если вам нужен полный код, я могу опубликовать его, но я думаю, что нет необходимости.

+1

Почему вы передаете 'numPlayers' в качестве указателя? – Barmar

ответ

2

Вы не можете передать тип в качестве параметра. Но вы можете передать в его размере:

void *allocate_memory(int *numPlayers, size_t struct_size) 
{ 
    void *retVal = malloc(struct_size * (*numPlayers)); 

    if (!retVal) { 
     perror("malloc failed!"); 
     exit(1); 
    } 
    return retVal; 
} 

Затем вызовите его следующим образом:

struct mystruct *s = allocate_memory(&numPlayers, sizeof(struct mystruct)); 

Или вы просто сделать это вместо того, чтобы, если вы хотите, чтобы память инициализируется все 0:

struct mystruct *s = calloc(numPlayers, sizeof(struct mystruct)); 
+0

Это, по сути, то, что делает 'calloc()', за исключением того, что он также обнуляет память. – Barmar

+0

Да! который сделал трюк, спасибо за быстрый ответ. – honeyPot

+0

Я хотел поставить nullcheck в эту функцию, не писал ее под вопросом, вот и все дело в создании этой функции. – honeyPot

1

Вы можете использовать указатель void там, void может взять что-нибудь ... надеюсь, что это поможет ....

0

У вас есть два варианта: первый возвращая новый указатель (см. allocate_memory), а второй - заполнить существующий указатель (см. allocate_memory2. В обоих случаях я преобразовал numPlayers в int, потому что не нужно предоставлять по ссылке

struct structName *allocate_memory(int numPlayers) 
{ 
    struct structName *retVal = malloc(sizeof(struct structName) * numPlayers); 
    return retVal; 
} 

void allocate_memory2(struct structName **target, int numPlayers) 
{ 
    *target = malloc(sizeof(struct structName) * numPlayers); 
} 

int main(int argc, char** argv) 
{ 
    struct structName *str; 
    struct structName *str2; 
    //After this line str is a valid pointer of size 20*sizeof(struct structName) 
    str = allocate_memory(20); 
    //After this line str2 is a valid pointer of size 20*sizeof(struct structName) 
    allocate_memory2(&str2, 20); 
} 
0

Вы не можете передать тип в качестве параметра функции.

Вы в основном есть два варианта реализации вашего allocate_memory функции:

  • Вместо передачи имени типа просто передать размер типа: void *allocate_memory(int *numPlayers, size_t size). Но это всего лишь тривиальная обертка для malloc.
  • Чтобы выполнить эту работу, вы можете написать макрос #define allocate_memory(num, type) (malloc(num * sizeof(type))).

Может быть, вы ищете сочетание обоих, если вы хотите отслеживать некоторые статистические данные о памяти, выделенной или делать дополнительные проверки:

#define allocate_memory(num, type) (my_malloc((num), sizeof((type)))) 

void *my_malloc(int num, size_t size) 
{ 
    void *pMem = malloc(num * size); 

    if (pMem == NULL) 
    { 
     /* do error handling */ 
    } 

    return (pMem); 
} 

Вы можете использовать вышеупомянутую макрос следующим образом:

pInt = allocate_memory(5, int); // allocates 5 integers 
pStruct = allocate_memory(10, some_struct); // allocates 10 some_structs 
+0

yep Я хотел добавить null_check для работы – honeyPot

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