C语言题请教

2025-02-23 18:54:22
推荐回答(3个)
回答1:

我想问这是哪的题
如果是计算机专业的考研题,或者是编译原理课的考试题,那么值得分析一下。
如果是 C 程序设计题,那么出题人的水平值得质疑

要回答这道题,需要 C 知识,更需要操作系统的内存处理模式及 CPU 在处理内存地址方面的知识。

另外可以明确告诉你,这道题对不同的操作系统或 CPU 答案是不确定的。
与 int 型存储高低字节以及具体平台下 int 型的字长有关(C 标准没有规定 int 必须是多少字节)。
现在只能说在 Intel X86 (高位高地址) 和 Win32 下答案是 D。其他平台有待考察

要分析过程也可以写,但仍然要说,实际中没人这么写代码,自己给自己找麻烦

首先看 union 里共有两个成员,一个 int 另一个 struct。一个一个来分析
对一个 int 型,32位系统下占用 4 字节空间。
我们来看下操作系统内存是如何分配的:

低地址 <--------------------------------------------------> 高地址
| | 函数调用栈
|<-------------未使用---------------->| 栈顶 <-------------> 栈底
| <---
栈增长方向

假设按上图,操作系统分配给的一个 4 字节空间,从低地址到高地址由左向右排列,那么当给它赋值 0x1234 时,从低到高四个字节的内容有可能依次为
00 00 12 34 (都是16进制),也有可能依次为
34 12 00 00
前者是按高位放低地址的存储方式,后者是按高位放高地址的存储方式。对于 X86 CPU 和 Win32 系统,正对应了第二种存储方式。

下面再来看那个 struct ,它包含两个 char 型,一共只需占用 2 字节,要和上面的 int 型共用那 4 个字节,这就牵涉到如何分配的问题。简单来看,如果直接分配到低地址的2个字节,那么 实际的内存对应就像下面这样:
34 12 00 00 (int)
c1 c2 .. .. (struct)
在我的电脑上确实是这么分配的。但这并不是唯一的分配方法,有些平台下的编译器为了优化提高存取速度,会将单字节采用偶地址对齐的方式存放,如下也是一种可能性
34 12 00 00 (int)
c1 .. c2 .. (struct)
或者将 c1 c2 分配在高地址,像这样:
34 12 00 00 (int)
.. .. c1 c2 (struct)
这就是答案无法确定的原因。以上还没有考虑 int 型的长度为其他字节数的情况。

如果确定到 X86 CPU 和 Win32 平台下,那么对照上面第一种内存对应情况可知,当访问 a.b.c1 时实际取出的是 0x34 这个内容,而 c1 是 char 类型,0x34 (十进制 52)对应的字符刚好是 '4' (查 ASCII 码表),所以猜测出题人可能是想让人选 D 。但不得不说这道题漏洞很大,出成一道分析题都足够。

下面是一道考研专业试题,以做参考:
union
{
int i;
char c1;
}a;

i=0x4321;
printf("%d",c1);

请问c1的值是43还是21;

回答2:

回答3:

你用printf("%c",a.b.c1);输出一下就行了。计算起来比较复杂。