分配给静态变量和动态变量的位置有区别吗?

问题描述 投票:0回答:1

动态变量的位置是否有限制,静态变量有什么不同吗? 进程内存中是否存在不能分配动态变量而可以分配静态变量的分区?


我正在使用 C 语言的在线 IDE 并尝试使用指针,这时我注意到动态分配的变量在打印时似乎具有较短的方向。 (示例)

  • 静态变量指针:0x7ffc49f6fbe4
  • 动态变量指针:0x15512a0

起初,这让我认为动态变量的指针比静态变量的指针更小。 我尝试了一些方法来了解情况是否如此:首先,我尝试查看各种类型的指针,以了解这是否仅适用于动态变量。 然后,我尝试了使用动态和静态变量指针的 sizeof() :

  int a;
  int *b=malloc(sizeof(int));
  printf("%lu\n%lu",sizeof(&a),sizeof(b));

两者都返回 8 个字节。我计算了打印的十六进制值中的字节数。静态变量有 16 个十六进制数字 = 8 个字节,而动态变量有 7 个十六进制数字 = 4 个字节。字节的减半给了我另一个想法:也许静态和动态方向有可以分配的内存的不同部分,所以当我打印动态指针的方向时,它不会费心给我整个方向,只是打印动态指针可以占用的部分。当我向方向添加 1 并且最后一个十六进制是两个指针中要更改的十六进制时,这一点得到了加强。如果我添加足够的内容以强制打印显示另一个数字,它也会显示新的数字:

  int a, *b;
  int *c=malloc(sizeof(int));
  printf("%p\n%p\n%p",&b,c,c+67108864);

演出:

0x7fffc15b5920
0x211e2a0
0x1211e2a0

我尝试寻找这个问题,但找不到,所以我正在做。

c pointers memory dynamic-memory-allocation
1个回答
0
投票

尝试在您的(64 位)系统上编译并运行以下命令:

#include <stdio.h>

int main( void ) {
    static int a; // static
    int b; // on the stack
    int *c = malloc( sizeof *c ); // preferable syntax for dynamic allocation

    printf( "%16p\n%16p\n%16p", &a, &b, c );

    free( c ); // don't forget!

    return 0;
}

注意这三类数据的地址差异很大。

© www.soinside.com 2019 - 2024. All rights reserved.