本地和全局变量的地址

时间:2014-02-09 10:36:19

标签: c pointers

我编写了这个程序来检查局部变量和全局变量的地址。我读到堆栈段存储局部变量,数据段存储全局变量。但是当我执行这个程序时,两个变量的地址没有太大差别,这意味着它们必须在同一个段中。不明白为什么会发生这种情况..这里是代码和输出 -

    #include<stdio.h>
    int *chr;
    void main(){
        int *char1;
        printf("global- %p \n local- %p",chr,char1);
        chr=malloc(sizeof(int));
        char1=malloc(sizeof(int));
        printf("malloc_global  = %p \n malloc_local = %p",chr,char1);
   }

输出是 -

global- (nil) 
 local- (nil) 
malloc_global  = 0x969010 
 malloc_local = 0x969030 

3 个答案:

答案 0 :(得分:5)

我认为您对变量及其存储位置以及这些变量的内容感到困惑;当您选择使用指针变量时出现混淆,因此有两个相关的地址(存储指针变量的位置,以及它的内容是什么)。

让我们来看看发生了什么。

chr是全局的,在数据​​段中。 chr1是本地的,在堆栈段上。

但是,您不会打印出存储chrchr1的位置,而是打印chrchr1的内容。作为全局的chr保证初始化为零。 chr1作为本地未定义。这只是运气,这是零。然后使用malloc分配内存,并将分配的地址分配给chrchr1malloc()在堆上分配并用于两个分配,因此chrchr1包含类似的地址。同样,您打印这些变量的内容,而不是它们的地址(即存储该​​内容的位置)。要做到后者你想要:

printf ("global: %p \nlocal: %p\n", &chr, &char1);

请注意&运算符,它使用变量的地址。变量本身包含作为地址的内容的事实(为此目的)是无关紧要的;例如,它们可能是整数。

答案 1 :(得分:4)

  

两个变量的地址没有太大区别,这意味着它们必须位于同一段

正确。它们是:两者都指向堆地址,这是malloc分配存储的地方。您可以使用&chr&char1输出指针的地址,如Mitch所述。那些可能更不同(或者不是;你的程序是微不足道的,也许编译器仍然将它们紧密地联系在一起,即使它们在不同的段中)。

答案 2 :(得分:2)

尝试打印出&chr&char1的值,而不是其内容所指向的值。

malloc()从堆中分配存储,两个变量都指向堆上的内存。