c程序中的三维数组

时间:2014-10-19 00:54:41

标签: c

经过努力,我无法解决以下问题。 2014年,印度工程专业毕业生能力测试(GATE)中提出了问题。

问题)对于访问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被声明为" int X[4][32][8]"。

(d)X被声明为" int X[32][16][2]"。

为以前的论文提供解决方案的书之一说答案是选项(a)。怎么样?任何解释

提前致谢

4 个答案:

答案 0 :(得分:2)

t1i * (inumInts * sizeof(int))

所以,inumInts * 32 = 1024。

因此,inumInts = 32。

t1j * (jnumInts * (inumInts/sizeof(int)),因为j的每一行都有1 i

所以,jnumInts * 1 = 32。

因此,jnumInts = 32。

t2k * (knumInts * (inumInts/sizeof(int) / ((inumInts*jnumInts)/sizeof(int))))。 (因为每iij k

所以,knumInts * 1/2 = 4。

因此,knumInts = 8。

因此,int X[32][32][8]

答案 1 :(得分:2)

信息不足。我会试着向你证明:

为了让我们的生活更轻松,让我们将所有值除以4,因为它是整数的大小(考虑到8位的字符大小)。这让我们:

i的乘数:256; 乘数j:8; 乘数k:1。

k必须为1,因为它是最后使用的索引,这意味着它必须只跳转1个整数才能到达行中的下一个。

另一方面,

j必须跳过8个整数,因此它可以到达下一行的相同位置。这意味着每行有8个整数。我们有k的价值。我们的数组X现在看起来像:X [i] [j] [8]

我必须跳过256个整数才能进入下一列。由于一行有8个整数,256/8 = 32,这意味着每列有32行,数组X为:X [i] [32] [8]

最后,我们需要知道数组有多少页面。但是没有办法知道这一点,因为我们需要以字节为单位的数组的完整大小,所以我们可以将它除以256,然后知道页数。这导致我们回到这个答案的开头:信息不足。

答案 2 :(得分:2)

Exp:给出int的大小为4B,char的大小为1B。内存是字节可寻址的。 让数组声明为类型X [A] [B] [C](其中Type = int / char和A,B,C是自然的 号)。

From t0 = i*1024, we conclude that B*C*(size of Type) = 1024. 
From t1 = j*32, we conclude that C*(size of Type) = 32. 
From t2 = k*4, we conclude that size of Type = 4. 
Type = int, and 
C = 8, and 
B = 32.

答案 3 :(得分:1)

数组的第一个维度对地址计算没有影响。 sizeof(int)确实会对地址计算产生影响。所以它可能有助于重写答案a)as

X[][32][8][4]
     i  j  k

最后[4]代表sizeof(int)。所以地址计算是

(k * 4) + (j * 8 * 4) + (i * 32 * 8 * 4) = i * 1024 + j * 32 + k * 4

由此,我得出结论,a)和c)都是正确答案。