C语言的联合出错
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言的联合出错相关的知识,希望对你有一定的参考价值。
#define MAX_FEATURE_NUM 42
#define MAXNumber 70
#define MAXLINE 500
#define NUMBER 494021
#define ERROR -1
#define NULL -1
typedef struct ArcBox
int tail,head;
struct ArcBox * hlink,* tlink;
ArcBox;
typedef struct FeaNode
char * feaname;
int type;
union range
char * c_range[MAXNumber];
int i_range[MAXNumber];
double d_range[MAXNumber];
;
int indegree;
int valuenum;
int visit[MAXNumber];
struct ArcBox * parent,* child;
FeaNode;
typedef struct
struct FeaNode fealist[MAX_FEATURE_NUM];
int feanum,arcnum;
BayesNetwork;
struct LNode
int sequence;
int valuenum;
int n;
int flag;
int type;
union Lrange
char ** c_range;
int * i_range;
double * d_range;
;
int * visit;
struct LNode * next;
;
typedef struct LNode * Linklist;
Linklist CalParent (BayesNetwork * nb,int i)
struct ArcBox * r;
struct LNode * p,* q;
Linklist head=(Linklist)malloc(sizeof(struct LNode));
if(!head)
error ("No space for node can be obtained!");
return ERROR;
p=head;
r=(* nb).fealist[i].parent;
while(r)
q=(struct LNode *)malloc(sizeof(struct LNode));
if(!q)
error("No space for node can be obtained!");
return ERROR;
q->type=(* nb).fealist[r->tail].type;
q->Lrange.d_range=(* nb).fealist[r->tail].range.d_range;
q->visit=(* nb).fealist[r->tail].visit;
q->sequence=r->tail;
q->valuenum=(* nb).fealist[r->tail].valuenum;
q->n=0;
clear(q->visit,q->valuenum);
p->next=q;
p=q;
r->hlink=r;
p->next=NULL;
return(head);
错误提示为:
D:\My Documents\3\Enum.C(38) : error C2039: 'Lrange' : is not a member of 'LNode'
d:\my documents\3\linklist.h(2) : see declaration of 'LNode'
D:\My Documents\3\Enum.C(38) : error C2039: 'range' : is not a member of 'FeaNode'
d:\my documents\3\bayesnetwork.h(14) : see declaration of 'FeaNode'
请教大家,到底是哪里出现了问题,谢谢了!
还有你的头文件呢 参考技术B 楼上的,union是联合。也就是共用体。
探讨C语言中的“联合“类型
前面我们知道C语言在定义一个变量时,往往会为定义的变量分配一段内存空间。但是C语言有一个特殊功能,可以使多个变量共享同一个内存。这个功能可以通过联合来实现。那么什么是联合呢?
一.联合
联合:在C语言中允许多个不同变量共享同一内存区域的功能称为联合。
假如现在我要定义三个变量共享的一个联合,也就是三个变量同属同一内存区域,应该怎么定义呢?
union unnode
int n;
double a;
char c1;
u;
现在我们来看上述代码,你发现它与那一种类型很相似呢?对的,从其结构上看,与我们所学的结构模板极为相似。最明显其头部的关键字不一样,结构的关键字是struct,而联合的关键字是union(就是联合的英文单词)。其次你会发现,3个变量n,a,c1的数据类型不同,也就是说不同数据类型的变量也可以联合起来,共享同一内存,不一定非要都是同一数据类型。分号前的u表示定义一个联合变量。即在声明联合时定义联合变量,这一点与我们前面所说的定义结构类型时定义结构变量是相通的。当然也可以这样定义:union unnode u;
刚才我们说了,所谓联合就是不同变量占同一内存空间,那么编译系统如何为联合变量分配内存空间呢?如char型占一个字节,int型占4个字节,double型占8个字节。那么在上例中,编译系统为上述联合变量分配几个字节的内存空间呢?C语言规定,编译器按联合的成员中最长的那一个类型为联合变量分配存储空间,所以为u分配8个字节,其中u.n占前4个字节,u.a占全部8个字节,u.c1占前一个字节。由于同一内存单元在每一个瞬间只能存放其中一种类型的成员,也就是说同一时刻只有一个成员是有意义的,因此在每一瞬间起作用的成员就是最后一次被赋值的成员。基于此,不能为联合的所有成员同时进行初始化,只能对第一个成员初始化。
记住:联合成员的访问与结构成员的访问一模一样。
//定义一个联合类型,用其声明变量,为变量赋值后输出各成员的值
#include<stdio.h>
union share
float decval;
int pnum;
double my_value;
u;
int main(void)
u.my_value = 125.5;
u.pnum = 10;
u.decval = 1000.5f;
printf("\\ndecval=%f pnum=%d my_value=%lf",u.decval,u.pnum,u.my_value);
printf("\\nu size=%d\\ndecval size=%d pnum size=%d my_value
size=%d",sizeof(u),sizeof(u.decval),sizeof(u.pnum),sizeof(u.my_value);
return 0;
运行结果
decval=1000.500000 pnum = 1148854272 my_value = 125.500016
u.size=8;
decval size=4 pnum size=4 my_value size=8
总结:由输出结果可以看出,只有最后一个变量的值是正确的,其它两个都是错的,这是因为他们共享同一块内存空间。
二.联合指针
定义联合指针可以用下列语句:
union unode *p;
有了指针后,就可以修改联合的成员。如下语句:
p = &u; u1.a = p---->a;
三.联合的初始化
只能用和联合中第一个变量相同类型的常量初始化。
四.联合和结构
结构和数组可以是联合的成员,反之联合也可以是结构的成员。对此要合理结合结构和联合,这样可以定义出各种各样能满足实际需要的数据类型。
以上是关于C语言的联合出错的主要内容,如果未能解决你的问题,请参考以下文章