#include <stdio.h>
#include <stdlib.h>
typedef struct BiTNode
{
char data;
struct BiTNode *lchild, *rchild;
}BiTnode,*BiTree;
void main()
{
BiTree *tree=NULL;
*tree=(BiTree)malloc(sizeof(BiTnode));
return;
}
以上代码运行出错,请高手给解答下这是怎么回事呢?谢谢!!
C语言关于开辟内存和指针的问题
答案:4 悬赏:70 手机版
解决时间 2021-02-06 11:44
- 提问者网友:孤凫
- 2021-02-06 07:34
最佳答案
- 五星知识达人网友:妄饮晩冬酒
- 2021-02-06 07:42
你这是想用二级指针 ,,,但事实上 却得到了 不正确的 结果 ,,这也是指针 容易出错的地方。
你先定义了一个二级指针 ,tree 并初始化 为 NULL,也就是 0,tree本身在栈区,但其指向0。
然后 *tree ,这个*tree 的意思 你能明白 吗? 是访问0这个地址,也就是将 后面分配来的地址 写到 0 这个内存地址上,但0号地址事实上不可用,因而导致程序异常。你完全没必要用二级指针 ,也就是你将 main 里面的 两个 两个 * 去掉就可以了 当然 你也没有释放内存。 正确的写法如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct BiTNode
{
char data;
struct BiTNode *lchild, *rchild;
}BiTnode,*BiTree;
void main()
{
BiTree tree=NULL;
tree=(BiTree)malloc(sizeof(BiTnode));
free(tree);
tree=NULL;
return;
}
如果要用二级指针 :
#include <stdio.h>
#include <stdlib.h>
typedef struct BiTNode
{
char data;
struct BiTNode *lchild, *rchild;
}BiTnode,*BiTree;
void main()
{
BiTree tree=NULL;
tree=(BiTree)malloc(sizeof(BiTnode));
//想使用二级指针 可以在这里定义
BiTree * ptree=&tree; //ptree 是 指向 你申请的空间的二级指针
free(tree);
tree=NULL;
return;
}
你先定义了一个二级指针 ,tree 并初始化 为 NULL,也就是 0,tree本身在栈区,但其指向0。
然后 *tree ,这个*tree 的意思 你能明白 吗? 是访问0这个地址,也就是将 后面分配来的地址 写到 0 这个内存地址上,但0号地址事实上不可用,因而导致程序异常。你完全没必要用二级指针 ,也就是你将 main 里面的 两个 两个 * 去掉就可以了 当然 你也没有释放内存。 正确的写法如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct BiTNode
{
char data;
struct BiTNode *lchild, *rchild;
}BiTnode,*BiTree;
void main()
{
BiTree tree=NULL;
tree=(BiTree)malloc(sizeof(BiTnode));
free(tree);
tree=NULL;
return;
}
如果要用二级指针 :
#include <stdio.h>
#include <stdlib.h>
typedef struct BiTNode
{
char data;
struct BiTNode *lchild, *rchild;
}BiTnode,*BiTree;
void main()
{
BiTree tree=NULL;
tree=(BiTree)malloc(sizeof(BiTnode));
//想使用二级指针 可以在这里定义
BiTree * ptree=&tree; //ptree 是 指向 你申请的空间的二级指针
free(tree);
tree=NULL;
return;
}
全部回答
- 1楼网友:神的生死簿
- 2021-02-06 11:00
变量 tree应该定义为BiTree ,并将*tree改为tree, 因为BiTree 类型本来就是指向节点类型(BiTnode)的指针,没必要再定义指向BiTree类型的指针了。修改后代码为:
BiTree tree=NULL;
tree=(BiTree)malloc(sizeof(BiTnode));
- 2楼网友:独钓一江月
- 2021-02-06 10:07
这样虽然可以正常输出,但是实际上你把别的某个地方给用了。这个地方有可能是其他变量的内存空间,也有可能是某段程序代码的内存空间。所以,对于你这个小程序,可能恰好没有遇到问题,但是多运行几次说不定就出问题了,或者程序更大的时候,就出问题了。
- 3楼网友:十鸦
- 2021-02-06 09:18
#include <stdio.h>
#include <stdlib.h>
typedef struct BiTNode
{
char data;
struct BiTNode *lchild, *rchild;
}BiTnode,*BiTree;
void main()
{
BiTree *tree=NULL;
tree=(BiTree*)malloc(sizeof(BiTnode));
return;
}
//你要让他的指针准确指向一个内存块,而不是用他的间接地址指向
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯