我编写了这个程序来检查局部变量和全局变量的地址。我读到堆栈段存储局部变量,数据段存储全局变量。但是当我执行这个程序时,两个变量的地址没有太大差别,这意味着它们必须在同一个段中。不明白为什么会发生这种情况..这里是代码和输出 -
#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 :(得分:5)
我认为您对变量及其存储位置以及这些变量的内容感到困惑;当您选择使用指针变量时出现混淆,因此有两个相关的地址(存储指针变量的位置,以及它的内容是什么)。
让我们来看看发生了什么。
chr
是全局的,在数据段中。 chr1
是本地的,在堆栈段上。
但是,您不会打印出存储chr
和chr1
的位置,而是打印chr
和chr1
的内容。作为全局的chr
保证初始化为零。 chr1
作为本地未定义。这只是运气,这是零。然后使用malloc
分配内存,并将分配的地址分配给chr
和chr1
。 malloc()
在堆上分配并用于两个分配,因此chr
和chr1
包含类似的地址。同样,您打印这些变量的内容,而不是它们的地址(即存储该内容的位置)。要做到后者你想要:
printf ("global: %p \nlocal: %p\n", &chr, &char1);
请注意&
运算符,它使用变量的地址。变量本身包含作为地址的内容的事实(为此目的)是无关紧要的;例如,它们可能是整数。
答案 1 :(得分:4)
两个变量的地址没有太大区别,这意味着它们必须位于同一段
正确。它们是:两者都指向堆地址,这是malloc
分配存储的地方。您可以使用&chr
和&char1
输出指针的地址,如Mitch所述。那些可能更不同(或者不是;你的程序是微不足道的,也许编译器仍然将它们紧密地联系在一起,即使它们在不同的段中)。
答案 2 :(得分:2)
尝试打印出&chr
和&char1
的值,而不是其内容所指向的值。
malloc()
从堆中分配存储,两个变量都指向堆上的内存。