C是否有一种用malloc初始化结构并设置其字段的简写方法?

C是否有一种用malloc初始化结构并设置其字段的简写方法?,c,data-structures,struct,initialization,malloc,C,Data Structures,Struct,Initialization,Malloc,我有一个混乱的代码块,比如 result = (node*)malloc(sizeof(node)); result->fx = (char*)malloc(sizeof(char) * 2); result->fx[0]='x'; result->fx[1]='\0'; result->gx = NULL; result->op = NULL; result->hx = NULL; 在这里,我初始化类型为的元素 typedef struct node {

我有一个混乱的代码块,比如

result = (node*)malloc(sizeof(node));
result->fx = (char*)malloc(sizeof(char) * 2);
result->fx[0]='x'; result->fx[1]='\0';
result->gx = NULL; result->op = NULL; result->hx = NULL;
在这里,我初始化类型为的元素

typedef struct node
{
    char * fx; // function
    struct node * gx; // left-hand side
    char * op; // operator
    struct node * hx; // right-hand side
} node;
有没有速记的方法?换句话说,有没有一种方法能像我在C++中做的那样?
result = new node { new char [] {'x','\0'}, NULL, NULL, NULL };

您可以编写自己的包装函数:

static node *getNewNode(char *fx) {
  node *p = calloc(1, sizeof *p);
  if(p && fx) {
    p->fx = malloc(strlen(fx) + 1);
    if(!p->fx) {
      free(p);
      p = null;
    } else {
      strcpy(p->fx, fx);
    }
  }
  return p;
}
稍后,您可以将其称为:

node *result = getNewNode("x");
if(result) ...

它更具可读性,也不太杂乱。

你不能有两个嵌套的malloc,一次初始化所有东西。但是,我建议采用以下设计:

typedef struct node
{
    char fx[2], op[2];    // first byte being null indicates not-present
    struct node *gx, *hx;
} node;
然后你可以更简单地写:

node *result = malloc( sizeof *result );

if ( !result )
    errorhandling......

// C89
node temp = { "x" };
*result = temp;

// C99
*result = (node){ .fx = "x" };
<99)C99示例使用C和C++中的复合文本和指定的初始化器。有关更多讨论,请参阅

您不必使用指定的初始值设定项,但它减少了出错的可能性。任何未显式初始化的结构成员都将像通过
0
一样进行初始化


在这两种情况下,理论上的临时对象都将被优化掉,因此不应认为该解决方案是低效的

很遗憾,没有。如果要用0初始化所有字段,可以使用
calloc
。不要键入
malloc
的结果。如果
fx
总是使用相同大小的malloc,那么您可以将其设置为一个数组。您可以澄清
'x'
是否要硬编码,或者,如果这是伪代码,并且您希望使用用户输入的数据初始化
fx
,例如,值得一提的是
“x”
是字符串文字,因此指向的
结果->fx
的最终值将不可修改。这是OP方法的一个限制。这意味着您将在堆栈上创建一个额外的临时对象。更好的解决方案可能是创建一个
静态常量节点
,所有内容都已就绪。@Lundin我使用
-O1
编译,并且堆栈上没有创建临时对象。汇编指令
movq
用于将
'x'
直接放置在malloc'd空间中。你能为你的建议显示代码吗?(请记住,OP可能希望
“x”
是在运行时获得的值)@alk
fx
是一个可修改的数组,字符串文本将复制到该数组中。最后的结果是可修改的。如果
“x”
是运行时输入,那么
静态
就不可能了,这样一个
常量
对象就没有意义了。否则,使用示例中的类型定义:
static const node DEFAULT={“x”,{'\0'},NULL,NULL}*结果=默认值是否使用指定的初始值设定项,这无关紧要。