c语言共用体典型错误,C语言中的共用体

文章目录

共用体(union)

定义

使用方式

使用注意点:

jni.h 中的案例

共用体(union)

进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体。 也叫 联合体。

共用体变量的地址和它的各成员的地址都是同一地址。其所占内存,与占用内存最大的成员变量一致。

定义

语法格式:

union 共用体名

{

成员列表

} 变量列表;

使用方式

与结构体的使用方式基本是一样的。也可以出现在结构体类型中;反之,结构体类型也可以出现在共用体类型中。

使用注意点:

union Combo {

int a;

float b;

char c;

} cob;

cob.b = 70.8f;

cob.a = cob.b + 3;

printf("---> %d\n", cob.a);

printf("占用字节 %lu\n", sizeof(cob));

printf("--->字符 %c\n", cob.c);

输出:

---> 73

占用字节 4

--->字符 I

上面的示例,可以看出:cob.c对应的整数值就是cob.a的值,即73。符合,共用体的内存覆盖技术。

但是要注意,在共用体中,整数和浮点数相互间不会自动转换。

将上面的使用代码修改一下:

cob.a = 70;

cob.b = cob.a + 3;

// cob.a = cob.b;

printf("---> %d\n", cob.a);

printf("占用字节 %lu\n", sizeof(cob));

printf("--->字符 %c\n", cob.c);

printf("---> %f\n", cob.b);

会发现,cob.a和cob.c的输出结果,都跟预计的不一样,是错误的值。因为,这时存储的最新的值是一个float型,所以也就不能正确输出cob.a和cob.c。

若,将上面的注释行打开,发现cob.a和cob.c 都输出正确了,但cob.b又不对了,因整数和浮点数相互间不会自动转换。

jni.h 中的案例

jni.h 中的 jvalue:

typedef union jvalue {

jboolean z;

jbyte b;

jchar c;

jshort s;

jint i;

jlong j;

jfloat f;

jdouble d;

jobject l;

} jvalue;

列举两个在 jni.h 中的函数:

jobject (*NewObjectA)(JNIEnv*, jclass, jmethodID, jvalue*);

jshort (*CallShortMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);

jvalue 都是用 …A 函数中的;jvalue* 表示一个jvalue 型的参数数组指针;

比如有两个参数, 一个 jint型, 一个 jdouble型;

jvalue A;

jvalue B;

A.i = 10;

B.d = 100.0;

jvalue ary[] = {A, B};

(*env)-> NewObjectA(env, jclazz, jmid, ary);

因看不到 NewObjectA的具体实现,所以对如何正确取 联合体jvalue 的类型,有点疑惑。猜想应该是,通过 jmethodID变量,获取到函数的参数类型;再通过类型,取得 jvalue变量的对应类型的值。

union 的特性:在某种场景下,只需要获取一种类型值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值