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