关于结构体变量定义的问题

小班得瑞 2012-04-18 08:11:34
我现在有三个文件:a.h, a.cpp, main.cpp
我在a.h里定义了一个结构体类型,并且声明了一个结构体变量

typedef struct node
{
int key;
struct node *lchild;
struct node *rchild;
}BiTreeNode, *BiTree;

extern BiTreeNode *NIL;

然后在a.cpp里进行如下操作

#include "a.h"

BiTreeNode *NIL = (BiTreeNode *)malloc( sizeof( BiTreeNode ) );
assert( NIL != NULL );
NIL->key = 0;
NIL->lchild = NULL;
NIL->rchild = NULL;

void BiTreeInsert()
{
//函数里使用到了结构体变量NIL
...
}

然后main.cpp也需要用到NIL结构体,所以我也类似a.cpp里处理
编译出现问题,给的错误的位置就是在a.cpp里的结构体变量定义的部分的内容

//错误信息提示是这里有问题
BiTreeNode *NIL = (BiTreeNode *)malloc( sizeof( BiTreeNode ) );
assert( NIL != NULL );
NIL->key = 0;
NIL->lchild = NULL;
NIL->rchild = NULL;

我不知道是什么问题,请大家帮我解答下,谢谢啦!
...全文
175 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
baicai_luobo 2012-04-19
  • 打赏
  • 举报
回复
回LZ,昨天晚上有事,回的太急,回错了。应该是声明BiTreeNode NIL ;(最为一个全局变量),然后
NIL.key=... NIL.lchild=... NIL.rchild=... 。
代码的话,你直接在你原有的代码上面将BiTreeNode *NIL = (BiTreeNode *)malloc( sizeof( BiTreeNode ) );
改为BitTreeNode NIL,即可(注意最好要初始化),最为一个全局的变量,然后在头文件里面extern,这样其他文件就可以用了,用的时候,我猜你是想用指针(因为你BiTreeNode *NIL = (BiTreeNode *)malloc( sizeof( BiTreeNode ) );就是想用一个指针嘛),可以用NIL的引用就行了(BiTreeNode NIL),具体的代码我就不贴了,因为你给的代码就那么一小点,我就只能就这个问题给你回复。
小班得瑞 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

回LZ,昨天晚上有事,回的太急,回错了。应该是声明BiTreeNode NIL ;(最为一个全局变量),然后
NIL.key=... NIL.lchild=... NIL.rchild=... 。
代码的话,你直接在你原有的代码上面将BiTreeNode *NIL = (BiTreeNode *)malloc( sizeof( BiTreeNode ) );
改为BitTreeNode N……
[/Quote]
我搞定了,我先定义了一个BiTreeNode nil = {...};然后再定义一个BiTreeNode *NIL = &nil;这样就好了
小班得瑞 2012-04-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

那你就不要用malloc,直接在A.h里面声明:BiTreeNode *NIL ;(最为一个全局变量)不就行了嘛,然后再进行复制,这样其他的函数、文件照样用它,也没什么错误呀。
[/Quote]
能给我具体的代码吗,谢谢啦!
baicai_luobo 2012-04-18
  • 打赏
  • 举报
回复
那你就不要用malloc,直接在A.h里面声明:BiTreeNode *NIL ;(最为一个全局变量)不就行了嘛,然后再进行复制,这样其他的函数、文件照样用它,也没什么错误呀。
小班得瑞 2012-04-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

不能到函数外做 赋值,函数调用等非初始化的工作。改成:
添加一个函数
void init()
{
BiTreeNode *NIL = (BiTreeNode *)malloc( sizeof( BiTreeNode ) );
assert( NIL != NULL );
NIL->key = 0;
NIL->lchild = NULL;
NIL->rchild = NULL;
……
[/Quote]
我现在有一个疑问,就是我在不同的源文件里,而且同一个源文件也有不同的函数里面都需要用到这个NIL,我该如何做呢
小班得瑞 2012-04-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

如果你把你的结构体声明 BiTreeNode *NIL = (BiTreeNode *)malloc( sizeof( BiTreeNode ) );写到一个函数里面的话,是没有问题的,不知道你试过没有。像你这样写,和这样写是没什么区别的:

#include <iostream>
using namesapce std;
BiTreeNode *NIL = (BiTreeNode *)……
[/Quote]
我就是无法解释这个错误的原因,听你这么一说豁然开朗了。非常感谢
baicai_luobo 2012-04-18
  • 打赏
  • 举报
回复
如果你把你的结构体声明 BiTreeNode *NIL = (BiTreeNode *)malloc( sizeof( BiTreeNode ) );写到一个函数里面的话,是没有问题的,不知道你试过没有。像你这样写,和这样写是没什么区别的:

#include <iostream>
using namesapce std;
BiTreeNode *NIL = (BiTreeNode *)malloc( sizeof( BiTreeNode ) );
assert( NIL != NULL );
NIL->key = 0;
NIL->lchild = NULL;
NIL->rchild = NULL;

int main()
{
...
}
这样问题就出来了:你的NIL是一个全局变量,但是你却用malloc分配,malloc是程序运行的时候在堆中开辟空间,而你的全局变量是在编译、链接了之后在内存的全局数据区分配空间的(就是执行之前就已经有自己的空间了),像你这么写是不伦不类的,这个时候你说你想对全局变量赋值(NIL->key = 0;
NIL->lchild = NULL;
NIL->rchild = NULL;),你说会出现什么后果。。。
如果你没有赋值的话,只是声明:BiTreeNode *NIL = (BiTreeNode *)malloc( sizeof( BiTreeNode ) );也不会出现错误的(这个我刚刚都试过),估计是编译器做了什么事情。。具体是怎么做的,我猜就是无视这句带malloc的话,但到底是个什么机制,就待楼下的说了。。。
LZ可以回想一下别人的代码:有这样在全局区malloc的吗?
evencoming 2012-04-18
  • 打赏
  • 举报
回复
不能到函数外做 赋值,函数调用等非初始化的工作。改成:
添加一个函数
void init()
{
BiTreeNode *NIL = (BiTreeNode *)malloc( sizeof( BiTreeNode ) );
assert( NIL != NULL );
NIL->key = 0;
NIL->lchild = NULL;
NIL->rchild = NULL;

}
然后在主函数的开始添加调用。再做其他工作。
int main()
{
init();

...
}

69,337

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧