2016-11-10 23 views
2
#include<stdio.h> 
int main() 
{ 
    int a,b; 
    float e; 
    char f; 
    printf("int &a = %u\n",&a); 
    printf("int &b = %u\n",&b); 
    printf("float &e = %u\n",&e); 
    printf("char &f = %u\n",&f); 
} 

输出是当变量没有在用于c是存储器分配

int &a = 2293324 
int &b = 2293320 
float &e = 2293316 
char &f = 2293315 

但是,当我使用此代码并更换printf进行float--

#include<stdio.h> 
int main() 
{ 
    int a,b; 
    float e; 
    char f; 
    printf("int &a = %u\n",&a); 
    printf("int &b = %u\n",&b); 
    printf("char &f = %u\n",&f); 
} 

则输出是

int &a = 2293324 
int &b = 2293320 
char &f = 2293319 

这里不提供地址浮动,但它宣称在上面。 我的问题是

  1. 内存是不是分配给程序中没有使用的变量?
  2. 为什么地址按递减顺序分配。从2293324到2293320?
+7

帮你一个忙,打印地址时使用'%p'。 – WhozCraig

+5

1)取决于编译器进行的优化 2)取决于编译器。 – mascoj

+0

C++在哪里? – KABoissonneault

回答

4

1)内存未分配给程序中未使用的变量吗?

是的,可以让编译器优化它。

2)为什么地址按递减顺序分配。从2293324到2293320?

即通常对于大多数本地存储的实现,他们所使用的CPU支持的堆栈指针从栈顶栈底。所有这些局部变量将最有可能在堆栈中分配。

+0

澄清:没有保证,并且没有4C标准要求的堆栈。事实上,有些实现根本不用变量来使用堆栈。或完全上升的堆栈。 – Olaf

+0

@Olaf试图改善措辞。我认为这种情况同样适用于c和C++标准。 –

+0

我真的不是在编辑之后。只是想放弃一个nitpicky评论;-) – Olaf

2

1)内存没有分配给程序不使用的变量?

这是允许的优化;如果一个未使用的变量不影响程序的可观察行为,编译器可能会完全丢弃它。请注意,大多数现代编译器会警告您未使用的变量(因此您可以将它们从代码中删除,或者对其进行处理)。

2)为什么地址按递减顺序分配。从2293324到2293320?

编译器不需要以任何特定的顺序为单独的对象分配存储空间,所以不要假设您的变量将按照它们声明的顺序进行分配。另外,请记住,在x86和其他一些系统上,堆栈会向下“向下”增长以减少地址。请记住,任何堆栈的顶部只是最近推送某些东西的位置 - 它与相对地址值无关。

0

尽管标准没有特别要求,但局部变量通常位于程序堆栈中。

当你输入一个函数时,首先要做的一件事就是减少堆栈指针,为局部变量提供空间。

SUBL #SOMETHING, SP 

地方在哪里所需的空间量和SP是堆栈指针寄存器。在你的第一个例子,东西大概13然后地址:

f is 0(SP) 
    e is 1(sp) 
    b is 5(sp) 
    a is 9(sp) 

我假设你编译器没有对齐堆栈指针。通常他们会给出更类似的东西:

f is 3(SP) 
    e is 4(sp) 
    b is 8(sp) 
    a is 12(sp) 

在32位系统上,SOMETHING会四舍五入为16。

您可能想要使用编译器生成汇编列表来查看底下发生了什么。

是不是将内存分配给未在程序中使用的变量?

请注意,对于局部变量存储器没有真正分配。一个变量临时绑定到程序堆栈上的一个位置(堆栈不是标准所要求的,但是在大多数情况下它是如何完成的)。这就是变量初始值未定义的原因。它可能已经被绑定到以前的其他东西。

编译器不需要为未使用的变量保留空间。他们可以被优化。通常,有编译器设置指示不要这样做进行调试。

为什么地址按递减顺序分配。从2293324到2293320?

程序堆栈一般会向下增长。从这些日子开始,程序将位于地址空间的底部,堆栈的上方和堆栈的另一端。

堆将朝向更高的地址增长。堆栈会朝着堆(低地址)发展。

虽然地址空间可能比现在更复杂,但堆栈的下降增长一直保持不变。

没有特别的要求,编译器按降序将变量映射到堆栈,但有50/50的机会会这样做。