我写这个程序是为了检查一个局部变量和一个全局变量的地址。我读到堆栈段存储局部变量,数据段存储全局变量。但是当我执行这个程序时,两个变量的地址没有太大区别,这意味着它们必须在同一个段中。无法理解为什么会这样。这是代码和输出-
#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
最佳答案
我认为您对变量及其存储位置以及这些变量的内容感到困惑;当您选择使用指针变量时会出现混淆,因此有两个相关的地址(指针变量的存储位置及其内容)。
让我们看看发生了什么。
chr
是一个全局的,并且在数据段中。 chr1
是本地的,在堆栈段上。
然而,您并不是打印出 chr
和 chr1
的存储位置,而是打印出 chr
和 chr1
的内容>。 chr
作为全局保证初始化为零。 chr1
作为本地未定义。幸运的是这是零。然后,您使用 malloc
分配内存并将分配的地址分配给 chr
和 chr1
。 malloc()
在堆上分配并用于两个分配,因此 chr
和 chr1
包含相似的地址。同样,您打印这些变量的内容,而不是它们的地址(即存储该内容的位置)。做你想要的后者:
printf ("global: %p \nlocal: %p\n", &chr, &char1);
注意 &
运算符,它获取变量的地址。变量本身保存作为地址的内容这一事实(为此目的)无关紧要;例如,它们可能是整数。
关于c - 局部变量和全局变量的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21657998/