C 如何将结构传递给函数以分配内存

C 如何将结构传递给函数以分配内存,c,function,struct,C,Function,Struct,正如标题所说,我想将结构传递给函数并分配内存,也许这是一个愚蠢的问题,但我找不到答案 structName *allocate_memory( int *numPlayers,structName ) { structName *retVal = malloc( sizeof(struct structName) * (*numPlayers) ); return retVal; } 问题在于,我们应该做什么? 如果您需要完整的代码,我可以发布,但我认为没有必要..您不能将类型作

正如标题所说,我想将结构传递给函数并分配内存,也许这是一个愚蠢的问题,但我找不到答案

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

   return retVal;
}
问题在于,我们应该做什么?
如果您需要完整的代码,我可以发布,但我认为没有必要..

您不能将类型作为参数传入。但您可以传递其大小:

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));

你可以在那里使用一个void指针,void可以接受任何东西…希望它有帮助….

你有两个选择,第一个是返回一个新指针(请参见
分配内存
),第二个是填充一个现有指针(请参见
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);
}

不能将类型作为参数传递给函数

基本上,您有两个选项来实现
分配内存
功能:

  • 只需传递类型的大小,而不是传递类型的名称:
    void*allocate\u内存(int*numPlayers,size\u 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

这基本上就是
calloc()
所做的,只是它也会将内存归零。我想在这个函数中加入nullcheck,但没有对它进行编写,这就是创建这个函数的全部目的。为什么要将
numPlayers
作为指针传递?是的,我想在函数中添加null\u检查