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