我想创建一棵树。我看到了以下代码
#define NODEALLOC(struct treenode*)malloc(sizeof(struct treenode))
struct treenode{
int data;
struct treenode * left;
strruct treenode *right;
}
typedef struct treenode *treeptr;
treeptr root;
treeptr create(int d)
{
treeptr root;
root =NODEALLOC;
root->data=d;
root->left=null;
root->right=null;
return root;
}
我不理解#define
声明。任何人都可以帮助我吗?
答案 0 :(得分:1)
不要使用它。如果您不想多次写malloc
,请使用函数。使用这样的宏是你应该更好地避免的(这是合法的,但不被认为是一种好的做法)。
如果你不知道首先是什么宏,read。
答案 1 :(得分:1)
首先,这是错误的,它需要NODEALLOC
和(
之间的空格
其次,它是邪恶的。 是对宏的良好用途;这不是其中之一。
以下是它的工作原理:
这是一个简单的字符串替换,因此当您看到root=NODEALLOC;
时,它变为root=(struct treenode*)malloc(sizeof(struct treenode))
malloc(n)
分配n个字节的内存,sizeof
告诉malloc需要多大n
,(struct treenode*)
将malloc的返回void*
转换为正确的类型
答案 2 :(得分:0)
这很简单。将代码中的NODEALLOC替换为其定义。在你的情况下:
treeptr create(int d)
{
treeptr root;
root = (struct treenode*)malloc(sizeof(struct treenode)); // was NODEALLOC;
root->data=d;
root->left=null;
root->right=null;
return root;
}
因此,这是一个简单的分配。
但是,仅为此使用宏并没有多大帮助,它甚至会让读者感到困惑。通常,宏应该做一些有用的事情。