-4

假设内存位置从地址 100 开始,请考虑:

int a;
struct{
    char b;
    struct{
        short *c[20];
        char d;
    }e;
}f;
double g;
char *h;

我知道a地址为 100-103,但我无法确定当你有一个结构时会发生什么。我知道结构的起始地址是根据最大字段对齐的,并且整个结构的大小是最大字段的倍数,但是当两个结构如上所述嵌套时,我很难区分两者。另外,如果我们有一个指针,或者一个数字数组,short *c[20]我们如何确定这个声明占用的内存?如果有人可以解释每一行的地址布局,我将不胜感激。更重要的是,我希望能解释一下为什么以这种方式分配内存。

感谢您的时间。

4

3 回答 3

2

没有真正的规则。这取决于编译器。您可以保证的只是 的地址b低于 的地址e,而 的地址c低于 的地址d。并且每个元素的第一个元素struct的地址与struct. 另一方面,对于任何结构之外的元素,都没有任何保证。编译器可以分配a, f,gh以任何它喜欢的方式。

于 2013-02-04T13:55:53.517 回答
1

在 x86-16 位上:

int a;      // two bytes
struct{
    char b;    // One byte. 
    struct{     // Struct itself is aligned to the size of pointer
        short *c[20];    // pointers may be 2 or 4 bytes depending on compile mode. 
        char d;          // one byte
    }e;
}f;
double g;     // 8 bytes aligned to 8 bytes. 
char *h;    // 2 or 4 bytes. 

在 x86-32 位上:

int a;    // four bytes. 
struct{
    char b;   // one byte. 
    struct{   // struct padding to size of pointer. 
        short *c[20];  // pointers are 4 bytes. 
        char d;        // one byte. 
    }e;
}f;
double g;     // 8 bytes, aligned to 8 bytes. 
char *h;      // 4 bytes. 

在 x86-64 上:

int a;      // 4 bytes. 
struct{
    char b;  // One byte.
    struct{   // struct aligned to size of pointer
        short *c[20];   // Pointers are 4 or 8 bytes (typically 8)
        char d;   // One byte.
    }e;
}f;
double g;    // 8 bytes. Aligned to 8 bytes. 
char *h;     // 4 or 8 byte pointer, aligned to size of pointer. 

在其他一些架构中,这是完全有效的:

int a;      // 8 bytes
struct{
    char b;   // 4 bytes. 
    struct{   // Struct is not aligned to anything.
        short *c[20];  // Pointers are 8 bytes. 
        char d;       // 4 bytes
    }e;    
}f;
double g;  // 12 bytes, aligned to 4 bytes.  
char *h;   // pointers are 8 bytes. 

我会让您为每个示例进行数学运算,以计算实际地址是什么。但就像其他人所说的那样,布局完全取决于编译器,如果不了解特定编译器/处理器架构的规则,就无法确定。

于 2013-02-04T14:05:32.437 回答
0

每个指针占用 32 位或 64 位,具体取决于您的平台。一个包含 20 个元素的数组的大小是一个此类元素的 20 倍,以此类推。

出于对齐原因,会占用额外的空格。内存通常可以同时读/写几个字节,只要它们在同一个字或双字中。字节 100-103 形成一个双字。下一个从 104 开始......所有这些都完全依赖于平台。在某些平台上,读取非字对齐地址中的字甚至是非法的。

于 2013-02-04T14:06:22.200 回答