在C中找出地址

Joe*_*ley 3 c multidimensional-array memory-address

我正在尝试学习如何在C中找出地址.对于下面的代码,假设它是在32位小端机器上编译的.

struct {
    int n;
    char c;
} A[10][10];
Run Code Online (Sandbox Code Playgroud)

假设A [0] [0]的地址是1000(十进制),A [3] [7]的地址是什么?任何帮助表示赞赏!

chr*_*ock 8

C是行主要排序,这意味着首先计算最左侧的索引.从而:

&A[3] == 1000 + (3 * 10 * sizeof(your_struct))
Run Code Online (Sandbox Code Playgroud)

要查找列,我们只需添加剩余索引:

&A[3][7] == 1000 + (3 * 10 * sizeof(your_struct)) + (7 * sizeof(your_struct))
Run Code Online (Sandbox Code Playgroud)

请注意,这与big-endian vs little-endian架构无关.这只是一个单词中字节的位置,而你想要一个数组中结构的位置.

此外,sizeof(your_struct)不保证是sizeof(n) + sizeof(c)因为编译器可以填充您的结构.

最后,机器的32位特性意味着存储器地址寄存器的大小为32位.(或者换句话说sizeof(void*)==32).它表明您的处理器可以实际分配一个地址的内存量.这是与C中数据类型大小不同的问题.