C语言中,结果为什么是0呢。我以为是4呢,我看不出来。。谢谢,帮解决一下...
发布网友
发布时间:2024-09-25 20:19
我来回答
共5个回答
热心网友
时间:2024-10-04 15:33
#include <stdio.h>
int main(void)
{
union myun{
struct{int x,y,z;}u;
int k;
}a;
a.u.x=4;
a.u.y=5;
a.u.z=6;
a.k=0;
printf("%d\n",sizeof(a));
printf("%d\n",a.u.x);
printf("address x=%p\n",&a.u.x);
printf("address y=%p\n",&a.u.y);
printf("address z=%p\n",&a.u.z);
printf("address k=%p\n",&a.k);
return 0;
}
可见,x,y,z,k每个占4字节,x和k,共用同一个地址,这是union的特性
热心网友
时间:2024-10-04 15:33
因为a.k和a.u.x在内存中占用相同的地址空间
你要不看看a.u.y和a.u.z是什么,联合体在内存中占用的空间是以union中需要内存最大的变量为准的,你的程序中a需要3个int的空间(一个结构体),所以你看a.k的话,因为a.k是最后写进去的,而且和a.u.x一样是int型,并且在内存中占用相同的地址空间,所以读出来数据是相同的
热心网友
时间:2024-10-04 15:34
这里结构体四字节对齐,第一个元素,就是x和k是同一个内存空间。所以改了k就相当于改了x。
int *p=(int *)&a+1;
*p=0;
这样就修改了y的值
同理
int *p=(int *)&a+1;
*p=0;
这样就修改了z的值
内存布局你就明白了
热心网友
时间:2024-10-04 15:28
http://visionsky.blog.51cto.com/733317/151760,这个可以帮助你
“联合”与“结构”有一些相似之处。但两者有本质上的不同。在结构中各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和(空结构除外,同时不考虑边界调整)。而在“联合”中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。应该说明的是, 这里所谓的共享不是指把多个成员同时装入一个联合变量内, 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值。
下面举一个例了来加对深联合的理解。
例4:
#include <stdio.h>
void main()
{
union number
{ /*定义一个联合*/
int i;
struct
{ /*在联合中定义一个结构*/
char first;
char second;
}half;
}num;
num.i=0x4241; /*联合成员赋值*/
printf("%c%c\n", num.half.first, num.half.second);
num.half.first='a'; /*联合中结构成员赋值*/
num.half.second='b';
printf("%x\n", num.i);
getchar();
}
输出结果为:
AB
6261
从上例结果可以看出: 当给i赋值后, 其低八位也就是first和second的值; 当给first和second赋字符后, 这两个字符的ASCII码也将作为i 的低八位和高八位。
热心网友
时间:2024-10-04 15:29
union体是看最后一次存进去的数据,与里面具体的那个变量无关的。
变量a的最后一次赋值是0,所以结果也是0。