mea*_*any 2 c memory malloc binary-search-tree
我提出了一个问题,例如,当我做第一个节点后,我没有为节点提供足够的内存firstNode = (node)malloc(sizeof(node)).以下是*node的结构和使用malloc函数的insert函数.
typedef struct treeNode *node;
struct treeNode {
node left;
node right;
int data;
};
node firstN;
node secondN;
node insert(int a, node t){
if(t==NULL){
t = (node)malloc(sizeof(node));
t->data = a;
t->left = NULL;
t->right = NULL;
} else {
if(a < t->data){
t->left = insert(a, t->left);
}else if(a > t->data){
t->right = insert(a, t->right);
}
}
return t;
}
Run Code Online (Sandbox Code Playgroud)
这是main()我用malloc测试插入过程(我没有使用上面定义的插入函数,因为我仍在主要逐行测试).
firstN=(node)malloc(sizeof(node)*10);
firstN->data=1;
firstN->right=NULL;
firstN->left=NULL;
firstN->right=(node)malloc(sizeof(node)*10);
Run Code Online (Sandbox Code Playgroud)
对我来说有趣的是,虽然上面的工作,只是正常做(节点)malloc(sizeof(节点))(没有乘以10)不适用于第二个实例,firstN-> right.
我想知道为什么代码没有提供足够的内存,如果这是正确的情况.
这个:
t = (node)malloc(sizeof(node));
Run Code Online (Sandbox Code Playgroud)
是错误的,你没有分配足够的内存来保存结构,只是指向它的指针,因为它node是"指向struct treeNode" 的别名.
你需要:
t = malloc(sizeof *t);
Run Code Online (Sandbox Code Playgroud)
请注意这是多么简单?演员是一个坏主意,所以应该删除它.并且大小是错误的,所以让我们让编译器计算它.
对于许多(许多)分配,你将结果存储在某个指针中p,其值sizeof *p是正确的参数malloc().如果你当然正在分配数组,那么这就不成立,那么它通常n * sizeof *p用于表达式n.
此外,typedef在C中使用隐藏指针通常是一个坏主意,因为指针很重要,很快就会变得混乱.
| 归档时间: |
|
| 查看次数: |
1426 次 |
| 最近记录: |