2014-02-09 155 views
2

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

#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 
+0

理解*任何*类型都可以。你不需要声明指针。声明'char foo;'并打印'printf(“%p”,&foo);''将打印'foo'的位置。 – ArjunShankar

+0

@ArjunShankar:使用'%p'转换说明符打印的指针应该转换为与'void *'兼容的类型,如果它们不在。尽管在现代系统中很少见,但不同类型的指针可能具有不同的表示形式,并且传递与'void *'不兼容的类型以'%p'打印时具有C标准未定义的行为。 –

+0

@EricPostpischil - 你是对的。我的意见最初意味着作为对此问题的回答(与OP的“printf(”%p“)相反的早期(现已删除)评论的补充,它建议将printf(”%p“,&chr) CHR)')。 – ArjunShankar

回答

4

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

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

chr是一个全球性的,在数据​​部分。 chr1是一个本地,并在堆栈段。

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

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

注意&运算符,它接受变量的地址。变量本身持有的内容是一个地址的事实是(为此目的)不相关的;例如,它们可能是整数。

+0

+1'),用于指出OP的混淆。从指针的使用和OP的打印价值的尝试可以清楚地看出,OP对指针的理解缺乏清晰度。 – ArjunShankar

2

尝试打印出来的&chr&char1的值,而不是什么他们的内容指向在。

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

4

两个变量的地址并没有太大的区别,暗示他们必须在同一网段

正确的。它们是:两者都指向堆地址,这是malloc从中分配存储的地址。 Mitch指出,通过使用&chr&char1,您可以输出指针的地址。这些可能会更加不同(或者不是;你的程序是微不足道的,也许编译器仍然将它们贴在一起,即使它们在不同的部分)。

+0

我检查了&char1和&chr,得到了这个 - 全局0x600990 local- 0x7fffa55aec88 malloc_global = 0x600990 malloc_local = 0x7fffa55aec88这是地址的一个很大的区别。请解释这个 – Imdad

+1

@imdad当你通过'malloc'改变它的内容时,* pointer *的地址不会改变 - 为什么会这样呢?指针本身分配在堆栈(或全局段)上。只有* pointee *地址才会更改。 –

+1

@imdad'&chr'是全局变量的地址。 '&char1'是本地变量的地址。 'chr'和'char1'是变量的*内容*,它是'malloc'为你分配的地址。由于'malloc'分配了这两者,因此它们位于相同的内存区域('malloc'使用' – immibis