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”
是在运行时获得的值)@alkfx
是一个可修改的数组,字符串文本将复制到该数组中。最后的结果是可修改的。如果“x”
是运行时输入,那么静态
就不可能了,这样一个常量
对象就没有意义了。否则,使用示例中的类型定义:static const node DEFAULT={“x”,{'\0'},NULL,NULL}*结果=默认值代码>是否使用指定的初始值设定项,这无关紧要。