我有以下代码:
#include <stdio.h>
#include <stdlib.h>
typedef union stateof stateof;
union stateof
{
stateof* foo;
double* bar;
};
typedef struct hunch hunch;
struct hunch{
double* first;
double* second;
};
void main(){
#define write(x) printf("%d \n",x);
int* storage = 0;
stateof* un = (stateof*)&storage;
un->foo = 300;
write(storage);
un->bar = 600;
write(storage);
hunch* h = (hunch*)&storage;
h->first = 1200;
write(storage);
h->second = 1600;
write(storage);
}
这个程序的输出是:
300
600
1200
1200
这里发生了什么?
un->{foo,bar}
和 h->{first,second}
语句在绝对不指向时执行是什么意思到有效的结构?在此期间究竟发生了什么,为什么 union 的输出与结构的输出不同?
最佳答案
您的程序会导致各种 未定义的行为。您可以获得任何可以想象的输出。当您编译此代码时,您的编译器可能会向您发出各种警告 - 尝试修复这些警告,您应该会朝着更好的方向前进。
假设你有一个普通的系统,你得到你看到的输出的原因可以解释为:
- 修改
un->foo
会用值300
覆盖storage
- 然后打印出来。 - 修改
un->bar
会用值600
覆盖storage
- 然后打印出来。 - 修改
h->first
用值1200
覆盖storage
- 然后打印出来。 - 修改
h->second
(危险)用值1600
覆盖一些内存,然后您再次打印出storage
- 它仍然是1200
。
关于C指针转换规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5447755/