首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-04-24 
关于结构体变量定义的问题我现在有三个文件:a.h, a.cpp, main.cpp我在a.h里定义了一个结构体类型,并且声明

关于结构体变量定义的问题
我现在有三个文件:a.h, a.cpp, main.cpp
我在a.h里定义了一个结构体类型,并且声明了一个结构体变量

C/C++ code
typedef struct node{    int key;    struct node *lchild;    struct node *rchild;}BiTreeNode, *BiTree;extern BiTreeNode *NIL;

然后在a.cpp里进行如下操作
C/C++ code
#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里的结构体变量定义的部分的内容
C/C++ code
//错误信息提示是这里有问题BiTreeNode *NIL = (BiTreeNode *)malloc( sizeof( BiTreeNode ) );assert( NIL != NULL );NIL->key = 0;NIL->lchild = NULL;NIL->rchild = NULL;

我不知道是什么问题,请大家帮我解答下,谢谢啦!

[解决办法]
不能到函数外做 赋值,函数调用等非初始化的工作。改成:
添加一个函数
void init()
{
BiTreeNode *NIL = (BiTreeNode *)malloc( sizeof( BiTreeNode ) );
assert( NIL != NULL );
NIL->key = 0;
NIL->lchild = NULL;
NIL->rchild = NULL;

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

...
}
[解决办法]
如果你把你的结构体声明 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的吗?

热点排行