程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了用 malloc 初始化一个结构体大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决用 malloc 初始化一个结构体?

开发过程中遇到用 malloc 初始化一个结构体的问题如何解决?下面主要结合日常开发的经验,给出你关于用 malloc 初始化一个结构体的解决方法建议,希望对你解决用 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,请注明来意。
标签:malloc