C中的内存分配过程?它是向下还是自下而上的方法


#include<stdio.h> 
int main() 
{
    int a,b,*p,*q; 
    a=10; b=5; p=&a; q=&b; 
    float c=3.4, d=4.3, *r,*t;
    r=&c; t=&d; 
    char s='o'; 
    printf("address of a=%un",p); 
    printf("address of b=%un",q);
    printf("address of c=%un",r); 
    printf("address of d=%un",t); 
    printf("address of s=%un",&s); 
    return 0; 
}

使用这些代码输出,例如

address of a=1999992860
address of b=1999992856
address of c=1999992852
address of d=1999992848
address of s=1999992847

如果内存分配在自上而下的方法中,那么'd'如何将1个字节作为浮点变量?

如果实际上没有采用底部的方法,则可以。

现在,如果我考虑完成了自下而上的方法,则通过更改位置char s='o'

进行更改

在初始化int a,b之前,它将给出一些不同的结果。

address of `a=2987907272`
address of `b=2987907268`
address of `c=2987907264`
address of `d=2987907260`
address of `s=2987907279`

请帮助。

我想您是在问变量的报告地址是 start-address end-address 。这是前者,一个开始地址。在连续增加地址时占据字节的对象。

但是,请注意,圣标准不会限制一个对象驻留在连续的字节中,而是谈论存储的一个 region ,尤其是为了支持多个虚拟继承,可以是无连接。

实际上,最派生的对象占据了连续存储。

在您的第一个输出中,变量s在199992847占1个字节。变量d从1999992848及1999992851占据字节范围。

在任何情况下,您都应始终考虑由于某些魔术而分配的地址。编译器绝对可以免费重新排序变量,按顺序分配或另一种分配,涂抹填充等

更新:

该变量的地址始终是其区域的开始。不管分配的方向如何。

             +----------------------+
1999992847:  |       s              |
             +----------------------+
1999992848:  |       d              |
1999992849:  |                      |
1999992850:  |                      |
1999992851:  |                      |
             +----------------------+
1999992852:  |       c              |
1999992853:  |                      |
1999992854:  |                      |
1999992855:  |                      |
             +----------------------+
1999992856:  |       b              |
1999992857:  |                      |
1999992858:  |                      |
1999992859:  |                      |

最新更新