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】:
如果您尝试创建一个缓冲区来存储 nickname
和 name
的组合(另外我假设两者之间有一个空格),您可以这样做:
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 );
如果MAXNICKNAME
和MAXNAME
都已经考虑了字符串终止符,那么您可能不需要在上面为它添加1。您确实需要考虑组合名称中的额外空格(或任何其他额外字符)。
表达式teamInfoPtr->nickname
的类型是char [MAXNICKNAME]
,所以sizeof teamInfoPtr->nickname
等价于sizeof (char [MAXNICKNAME])
。同样的推理也适用于sizeof teamInfoPtr->name
。请记住,sizeof
是一个运算符,而不是一个函数 - 唯一需要使用括号的情况是操作数是类型名称时。当然,当操作数是表达式时,你可以使用括号,只是你不需要。
因为它们是sizeof
运算符的操作数,所以表达式teamInfoPtr->nickname
和teamInfoPtr->name
不会“衰减”以键入char *
。
【讨论】:
感谢约翰,这与我正在寻找的内容和出色的解释很接近。我不知道 sizeof 只是一个运算符,我不知道类型名称要求,尽管我以前只使用过它。我认为 teamInfoPtr->name 是 char 类型,因为 name 被声明为 char 类型? @AlB:name
和 nickname
被声明为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 结构的各个成员?的主要内容,如果未能解决你的问题,请参考以下文章