malloc sizeof 结构的各个成员?

Posted

技术标签:

【中文标题】malloc sizeof 结构的各个成员?【英文标题】:Malloc sizeof individual members of a struct? 【发布时间】:2021-03-02 05:05:48 【问题描述】:

所以我查找了结构的各个成员的 malloc,但只找到了一个简单的例子,即 double a、int b、然后是 sizeof(a + b)。我正在尝试对结构中的字符进行类似的努力,但无法弄清楚这是如何工作的。从在线资源中,我需要在变量之间使用逗号而不是 +,因为它是字符,尽管它不是很清楚。我可以 malloc 结构的整个大小,但这不是预期的目标。我正在优化空间。

文件 1

typedef struct _TeamInfo_s 
        char        name[MAXNAME];
        char        nickname[MAXNICKNAME];
        MLSconf_t   conf;
        float       ppg;
        int         pts;
        int         gp;
        int         win;
        int         loss;
        int         tie;
     TeamInfo_t, *TeamInfoPtr_t;

在文件 2 中用于 malloc

char* createKey(TeamInfoPtr_t teamInfoPtr) 
    //TODO:  WRITE THIS FUNCTION
    char* name = malloc(sizeof(TeamInfo_t.nickname,TeamInfo_t.name));
    //Extra code here for setting name
    return name;

【问题讨论】:

我不明白你想做什么。你想知道名字和昵称的大小吗? “结构的单个成员的malloc”:你不能这样做。所有成员都是连续的。您不能分配结构的一部分...除非您不读取或写入最后一个成员,在这种情况下,我建议您不要声明这些成员 如果您正在优化空间,请声明指针而不是数组,以将名称调整为实际名称 sizeof 是一元运算符。你不能像sizeof(TeamInfo_t.nickname,TeamInfo_t.name) 那样向它传递两个参数。也许你想要总尺寸? sizeof(team.nickname) +sizeof (team.name) 之类的东西? 你已经定义了你的数组长度,为什么不使用char *name = malloc(MAXNAME+MAXNICKNAME); 【参考方案1】:

如果您尝试创建一个缓冲区来存储 nicknamename 的组合(另外我假设两者之间有一个空格),您可以这样做:

char *name = malloc( sizeof teamInfoPtr->nickname + 
                     sizeof teamInfoPtr->name + 
                     1 + // for space between nickname and name 
                     1   // for string terminator
             );
sprintf( name, "%s %s", teamInfoPtr->nickname, teamInfoPtr->name );

如果MAXNICKNAMEMAXNAME 都已经考虑了字符串终止符,那么您可能不需要在上面为它添加1。您确实需要考虑组合名称中的额外空格(或任何其他额外字符)。

表达式teamInfoPtr->nickname的类型是char [MAXNICKNAME],所以sizeof teamInfoPtr->nickname等价于sizeof (char [MAXNICKNAME])。同样的推理也适用于sizeof teamInfoPtr->name。请记住,sizeof 是一个运算符,而不是一个函数 - 唯一需要使用括号的情况是操作数是类型名称时。当然,当操作数是表达式时,你可以使用括号,只是你不需要

因为它们是sizeof 运算符的操作数,所以表达式teamInfoPtr->nicknameteamInfoPtr->name 不会“衰减”以键入char *

【讨论】:

感谢约翰,这与我正在寻找的内容和出色的解释很接近。我不知道 sizeof 只是一个运算符,我不知道类型名称要求,尽管我以前只使用过它。我认为 teamInfoPtr->name 是 char 类型,因为 name 被声明为 char 类型? @AlB: namenickname 被声明为char 类型的数组,它们本身就是不同的类型(即char 是与char [10] 不同的类型,与char [20] 不同的类型等)。 要优化内存,最好在输入上使用strlen,所以name 具有确切所需的大小,而不是更多【参考方案2】:

如果我理解正确,试试这个:

typedef struct _TeamInfo_s 
        char        *name;
        char        *nickname;
        MLSconf_t   conf;
        float       ppg;
        int         pts;
        int         gp;
        int         win;
        int         loss;
        int         tie;
     TeamInfo_t, *TeamInfoPtr_t;

TeamInfo_t ti;

ti.name = malloc(MAXNAME);         // or whatever size you want
ti.nickname = malloc(MAXNICKNAME); // or whatever size you want

【讨论】:

以上是关于malloc sizeof 结构的各个成员?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过偏移获取/设置结构成员

自然对齐和强制对齐

关于柔性数组的一些问题

数据结构与算法基础之malloc()动态分配内存概述

malloc struct vs. 的“成员”当结构非常简单时,整个结构

结构体变量字节填充