对于访问 X[i][j][k] 的 C 程序,以下中间代码由编译器生成。假设整数的大小为 32 位,字符的大小为 8 位。
t0 = i ∗ 1024
t1 = j ∗ 32
t2 = k ∗ 4
t3 = t1 + t0
t4 = t3 + t2
t5 = X[t4]
下列关于 C 程序源代码的说法中哪一项是正确的?
(A) X 被声明为“int X[32][32][8]”。
(B) X 被声明为“int X[4][1024][32]”。
(C) X 被声明为“char X[4][32][8]”。
(D) X 被声明为“char X[32][16][2]”。答案:(一)
说明:可以按照相反的顺序执行中间代码步骤,将最终表达式简化为 i、j 和 k 的形式
t5 = X[t4]
= X[t3 + t2]
= X[t1 + t0 + t2]
= X[i*1024 + j*32 + k*4]
= X + i*1024 + j*32 + k*4
由于 k 乘以 4,因此数组必须是 int 数组。
在给定的 4 个选项中,我们只剩下 2 个选项(A 和 B)。
一维数组中的第 X[i][j][k] 个元素等价于
一维数组中的第 X[i*M*L + j*L + k] 个元素
(请注意,多维数组在 C 中按行主要顺序存储)。
所以我们得到以下方程
j*L*4 = j*32, we get L = 8 (4 is the sizeof(int))
i*1024 = i*M*L*4, we get M = 1024/32 = 32
因此选项 A 是唯一正确的选项,因为 M 和 L 分别为 32 和 8
仅在选项 A 中。
这个问题的测验