C、 指针-用于使用结构数组初始化嵌套结构的函数(为详细和清晰起见进行了编辑)

C、 指针-用于使用结构数组初始化嵌套结构的函数(为详细和清晰起见进行了编辑),c,pointers,struct,memory-management,initializer,C,Pointers,Struct,Memory Management,Initializer,学习C,我对指针和初始化结构感到非常困惑 我有struct PlayerType和struct TeamType,在头文件中声明了一个init函数。此文件看起来像: typedef struct { int number; int heaight; //inches int weight; //pounds char *name; } PlayerType; typedef struct { char *name; PlayerTy

学习C,我对指针和初始化结构感到非常困惑

我有struct PlayerType和struct TeamType,在头文件中声明了一个init函数。此文件看起来像:

typedef struct {
    int number;
    int heaight;    //inches
    int weight;     //pounds
    char *name;
} PlayerType;

typedef struct {
    char *name;
    PlayerType players[12];
} TeamType;

PlayerType* initializePlayer(int, int, int, char*);
TeamType*   initializeTeam(char*, PlayerType*);
我想在init.c文件中编写函数来初始化不同的团队和玩家,但是我不知道它如何与指针等一起工作。假设我有一个函数,我想用动态分配的内存初始化一个播放器,它将返回一个播放器(用whoami的补丁编辑,谢谢!):

(编辑:代码运行得很好,没有编译其他文件-就像我说的,对C非常陌生) 这使我在编译时陷入混乱,(…)

在我的主函数中,我初始化了一些玩家,但我不知道如何正确初始化团队,然后将玩家添加到其中

int main() {
    PlayerType plyr1 = initializePlayer(13, 75, 190, "Bob Smith");
    PlayerType plyr2 = initializePlayer(16, 80, 200, "Danny Clark");
    PlayerType plyr3 = initializePlayer(28, 91, 210, "Mike Green");
    PlayerType plyr4 = initializePlayer(20, 103, 225, "Alex Albert");       
    
    free(plyr1);
    free(plyr2);
    free(plyr3);
    free(plyr4);
    return 0;
}
    
这一切都很好,很好用。我搞不懂的是如何使initializetam函数与播放器数组配合使用。我的直觉是:

TeamType* initializeTeam(char* name, PlayerType players[]) {
    TeamType* team = (TeamType*) malloc(sizeof(team));
    if(team != NULL) {
        team->name = name;
        team->players = players[12];
    }
    return team;
 }
我认为这将获取一个大小为12的玩家结构数组,并将其存储在团队结构的玩家属性中。在编译时,这给了我数组类型表达式的
赋值,但我不知道在我的代码中的任何地方,播放器都没有定义为数组,这是我的想法

我想使用该函数初始化团队结构,然后执行以下操作:

team->players[0] = plyr1;
team->players[1] = plyr2;
team->players[2] = plyr3;
....

提前谢谢,希望这次我的问题提对了。

我在您的代码中看到了一些错误

  • 忘了包括

    需要使用malloc和free函数

  • 结构定义中的打字错误

  • initializePlayer函数中的声明错误

  • initializePlayer函数返回指针而不是结构

  • 使用malloc分配内存时sizeof类型错误,sizeof(*plyr)是错误的

  • 这里是固定代码

        #include <stdio.h>
        #include <stdlib.h> // include stdlib for malloc function
    
        typedef struct {
            int number;
            int height;     // inches, typos height or heiaght
            int weight;     // pounds
            char *name;
        } PlayerType;
    
        typedef struct {
            char *name;
            PlayerType players[12];
        } TeamType;
    
        PlayerType* initializePlayer(int, int, int, char*); // fix char to char*
    
        int main() {
            PlayerType* plyr1 = initializePlayer(13, 75, 190, "Bob Smith");
            printf("Superstar %s, weighing %d pounds and standing %d inches tall, wearing number %d", plyr1->name, plyr1->weight, plyr1->height, plyr1->number);
    
            free(plyr1);
            return 0;
        }
    
        PlayerType* initializePlayer(int number, int height, int weight, char *name){
            PlayerType* plyr = (PlayerType*)malloc(sizeof(PlayerType)); // should be typecasted and wrong sizeof argument
            if(plyr != NULL){
                plyr->number = number;
                plyr->name = name;
                plyr->weight = weight;
                plyr->height = height;  
            }
            return plyr;
        }
    
    #包括
    #include//include stdlib for malloc函数
    类型定义结构{
    整数;
    int height;//英寸、排印高度或高度
    int-weight;//磅
    字符*名称;
    }播放类型;
    类型定义结构{
    字符*名称;
    PlayerType播放器[12];
    }团队类型;
    PlayerType*初始化图层(int,int,int,char*);//固定字符到字符*
    int main(){
    PlayerType*plyr1=初始化图层(13,75,190,“Bob Smith”);
    printf(“超级明星%s,体重%d磅,身高%d英寸,穿着编号%d”,plyr1->姓名,plyr1->体重,plyr1->身高,plyr1->编号);
    免费(plyr1);
    返回0;
    }
    PlayerType*初始化图层(整数、整数高度、整数重量、字符*名称){
    PlayerType*plyr=(PlayerType*)malloc(sizeof(PlayerType));//应进行类型转换,且sizeof参数错误
    如果(plyr!=NULL){
    plyr->编号=编号;
    plyr->name=名称;
    plyr->重量=重量;
    plyr->高度=高度;
    }
    返回plyr;
    }
    

    您应该了解更多信息,并尝试理解指针和结构,以便更好地使用C

    在第二个typedef之后缺少一个分号。编译器在10us中找到它。我花了1s的时间。您的代码并没有那么糟糕,但您所展示的内容似乎不足以解释冲突的警告类型。这就是为什么我们通常希望像这样的调试问题包含。但是,我可以说您在
    initializePlayer()
    中似乎有一个错误。如果你说
    if(myProd!=NULL)
    ,你可能是指
    if(plyr!=NULL)
        #include <stdio.h>
        #include <stdlib.h> // include stdlib for malloc function
    
        typedef struct {
            int number;
            int height;     // inches, typos height or heiaght
            int weight;     // pounds
            char *name;
        } PlayerType;
    
        typedef struct {
            char *name;
            PlayerType players[12];
        } TeamType;
    
        PlayerType* initializePlayer(int, int, int, char*); // fix char to char*
    
        int main() {
            PlayerType* plyr1 = initializePlayer(13, 75, 190, "Bob Smith");
            printf("Superstar %s, weighing %d pounds and standing %d inches tall, wearing number %d", plyr1->name, plyr1->weight, plyr1->height, plyr1->number);
    
            free(plyr1);
            return 0;
        }
    
        PlayerType* initializePlayer(int number, int height, int weight, char *name){
            PlayerType* plyr = (PlayerType*)malloc(sizeof(PlayerType)); // should be typecasted and wrong sizeof argument
            if(plyr != NULL){
                plyr->number = number;
                plyr->name = name;
                plyr->weight = weight;
                plyr->height = height;  
            }
            return plyr;
        }