对于访问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]”。答案: (A)
说明:可以通过以相反顺序遵循中间代码步骤,以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中。
这个问题的测验