fiverhythm 发表于 2019-8-15 10:54:10

连续内存中间的值是什么神奇的东西?

#include <stdio.h>

int main()
{
        int z = 123;
        int *pz = &z;
        int x = pz ;

        int *pa = x+1;
        int *pb = x + 2;
        int *pc = x + 3;

        printf("%d\n", *pz);
        printf("%d\n", *pa);
        printf("%d\n", *pb);
        printf("%d\n", *pc);

}

结果如下:

+                pz        0x0022f8f4 {123}        int *
+                pa        0x0022f8f5 {-872415232}        int *
+                pb        0x0022f8f6 {-859045888}        int *
+                pc        0x0022f8f7 {-858993664}        int *

我知道int是4个字节,PZ就是代表了123这个整型的地址,如果只是pz+1,那么内存地址就直接跳跃4,变成0x0022f8f4+5=0x0022f8f9,那我就好奇了,从123内存地址开始后的3个地址储存了什么东西?
于是我去访问了内存中123作为首地址后连续3个内存地址0x0022f8f(5~7)的值,结果是上面的-872415232、-859045888、-858993664,这些值代表了什么?有什么特殊的含义吗?是什么神奇的东西呢?

flamer 发表于 2019-8-15 11:36:54

你要访问后面三个内存地址的东西,你用%c打印出来看呀,%d打印出来的东西它会以你给的地址开头,4个字节这么长的数据当成整数来输出实际上已经是越界了

迷雾少年 发表于 2019-8-15 12:11:13

如果编译器是把先声明的变量放在栈里的高地址空间,你这个就超出了这个函数里变量的地址空间了,没什么含义,栈里的垃圾数据
如果相反的,那就是下面的变量的数据了。

micolar 发表于 2019-8-15 14:20:48

楼主用这个程序试试


#include <stdio.h>

int main()
{
      int z = -2147483648;
               
      int a = -2147483648;
      int *pz = &a;
      int x = pz ;

      int *pa = x+1;
      int *pb = x + 2;
      int *pc = x + 3;
      int *pd = x + 4;
                &z,&x;
      printf("%d\n", *pz);
      printf("%d\n", *pa);
      printf("%d\n", *pb);
      printf("%d\n", *pc);
      printf("%d\n", *pd);
        return 0;
}
页: [1]
查看完整版本: 连续内存中间的值是什么神奇的东西?