C 局部和全局变量的地址

C 局部和全局变量的地址,c,pointers,C,Pointers,我写这个程序是为了检查局部变量和全局变量的地址。我读到堆栈段存储局部变量,数据段存储全局变量。但当我执行这个程序时,两个变量的地址并没有太大差异,这意味着它们必须在同一段中。我不明白为什么会这样。。以下是代码和输出- #include<stdio.h> int *chr; void main(){ int *char1; printf("global- %p \n local- %p",chr,char1); c

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

    #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);
   }

尝试打印
&chr
&char1
的值,而不是它们的内容所指向的值

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

这两个变量的地址没有太大差异,这意味着它们必须在同一段中


对。它们是:都指向堆地址,
malloc
从中分配存储。如米奇所述,您可以使用
&chr
&char1
输出指针的地址。这些可能更不同(或者不是;您的程序很简单,可能编译器仍然将它们紧密地粘在一起,即使它们是在单独的段中)。

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

让我们看看发生了什么

chr
是一个全局变量,位于数据段中
chr1
是一个本地文件,位于堆栈段上

但是,您打印的不是存储
chr
chr1
的位置,而是
chr
chr1
的内容
chr
作为全局变量,保证初始化为零
chr1
作为未定义的本地文件。幸运的是,这是零。然后使用
malloc
分配内存,并将分配的地址分配给
chr
chr1
malloc()
在堆上分配并用于两种分配,因此
chr
chr1
包含相似的地址。同样,您打印这些变量的内容,而不是它们的地址(即存储内容的位置)。要执行您想要的后者,请执行以下操作:

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

注意
&
运算符,它获取变量的地址。变量本身包含作为地址的内容这一事实(为此目的)是不相关的;例如,它们可能是整数

我检查了&char1和&chr,得到了这个-global-0x600990 local-0x7fffa55aec88 malloc_global=0x600990 malloc_local=0x7fffa55aec88这又是地址上的一个很大差异。请解释一下this@imdad当您通过
malloc
更改其内容时,指针的地址不会更改–为什么会更改?指针本身在堆栈(或全局段)上分配。只有指针对象地址更改。@imdad
&chr
是全局变量的地址
&char1
是局部变量的地址
chr
char1
是变量的内容,这些变量是
malloc
为您分配的地址。由于
malloc
分配了这两种类型,因此它们位于相同的内存区域(malloc使用的内存区域),了解任何类型都可以。您不需要声明指针。声明
charfoo和打印
printf(“%p”和&foo)
将打印
foo
@ArjunShankar的位置:使用
%p
转换说明符打印的指针应转换为与
void*
兼容的类型(如果尚未转换)。虽然在现代系统中很少见,但不同类型的指针可能具有不同的表示形式,传递与
void*
不兼容的类型以打印
%p
的行为不受C标准的定义。@EricPostpischil-你说得对。我的评论最初是对先前(现已删除)的评论的补充,该评论建议打印
printf(“%p”,&chr)
,作为对这个问题的回答(与OP的
printf(“%p”,chr)
)。+1指出OP的困惑。从指针的使用和OP打印其值的尝试可以明显看出,OP对指针的理解不够清晰。
printf ("global: %p \nlocal: %p\n", &chr, &char1);