c - 局部变量和全局变量的地址

标签 c pointers

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

    #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 是本地的,在堆栈段上。

然而,您并不是打印出 chrchr1 的存储位置,而是打印出 chrchr1 的内容>。 chr 作为全局保证初始化为零。 chr1 作为本地未定义。幸运的是这是零。然后,您使用 malloc 分配内存并将分配的地址分配给 chrchr1malloc() 在堆上分配并用于两个分配,因此 chrchr1 包含相似的地址。同样,您打印这些变量的内容,而不是它们的地址(即存储该​​内容的位置)。做你想要的后者:

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

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

关于c - 局部变量和全局变量的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21657998/

相关文章:

c - K&R 第二版标准库中的 fgets 实现

c - fgets() 和 strcpy() 的问题

c - 内核模式访问用户空间变量

c - 自旋锁初始化函数

delphi - 这段代码对指针做了什么?

c++ - 如何从C++中的指针读取字节序列?

c - 如何将两个 vector 相加并打印结果,这也是一个 vector

c - 解决指针转换警告

C++ 我应该使用指针还是引用?

c - 为什么 free 不清除指针值?