大佬教程收集整理的这篇文章主要介绍了用 malloc 初始化一个结构体,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
要创建结构,我可以执行以下操作之一:@H_618_3@
// Method 1
Item *item = malloc(sizeof(Item));
Item _item = {.name="job"};
item = &_item;
// Method 2
Item *item = malloc(sizeof(Item));
item->name="job";
有没有更简单的方法来做到这一点?也许是这样的:@H_618_3@
@H_236_5@malloc(sizeof(Item)) & (Item) {.name="job"}
这里有两种方法:https://godbolt.org/z/MfYGW3@H_618_3@
使用复合字面量:@H_618_3@
Item *item = malloc(sizeof *item);
*item = (Item) {
.name = "job",};
您的第一种方法是不正确的(即使没有拼写错误),因为您只是丢弃了刚刚 @H_236_5@malloc ed 的内存。你想写Item = _item;
@H_618_3@
,
你在寻找这样的东西吗?@H_618_3@
#include <stdlib.h>
typedef struct {
const char* name;
} Item;
int main() {
Item* item = malloc(sizeof(Item));
*item = (Item){.name = "Hello"};
// do work
free(item);
return 0;
}
使用 GCC 10.2.0 -Wall -Wextra
编译,没有错误或警告。@H_618_3@
,
没有好的方法可以动态分配 struct
实例并在同一语句中初始化其成员。您可以编写自己的函数来抽象出该操作:@H_618_3@
struct Item *newItem( const char *name /*,any additional arguments */ )
{
struct Item *item = malloc( sizeof *item );
if ( item )
{
item->name = malloc( strlen( name ) + 1 );
if ( item->name )
{
strcpy( item->name,name );
}
}
/**
* allocate/assign any additional members here
*/
return item;
}
int main( void )
{
struct Item *myItem = newItem( "job" /*,any additional arguments */ );
...
}
这已经足够了。@H_618_3@
编辑@H_618_3@
或者您可以将复合文字分配给分配的实例,如其他答案所示。这种方法的好处是作为一个“深”复制 - 任何本身是指向已分配内存的指针的成员最终都将指向新实例,而不是与原始实例相同的实例。@H_618_3@
以上是大佬教程为你收集整理的用 malloc 初始化一个结构体全部内容,希望文章能够帮你解决用 malloc 初始化一个结构体所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。