weijun_zhang 发表于 2021-4-18 15:11:29

P21:指针 非作业的答疑

按照老师P21节课:指针   的内容,我运行下发代码的结果如下。我的疑问如备注。烦请指点

a=F
a=6487567
a=123
a=6487560      //疑问:整型123占4个字节,可是560与567相差6个字节,为何?这两个地址不连续分配吗?
size of pa=1
size of pa=8    //疑问:老师课上和书上都说指针变量长度占4个字节,为何我运行下来sizeof(pa)=8?而不是4?
size of pb=4
size of pb=8    //疑问:同上

#include <stdio.h>

int main()
{
      char a='F';
      int b=123;
      
      char *pa=&a;
      int *pb=&b;
      
      printf("a=%c\n",*pa);   //打印指针地址指向的值,即a
                printf("a=%d\n",pa);    //打印指针地址,十进制
                printf("a=%d\n",*pb);
                printf("a=%d\n",pb);
               
                printf("size of pa=%d\n",sizeof(*pa));   //打印a的size
      printf("size of pa=%d\n",sizeof(pa));    //打印指针变量pa的size
      printf("size of pb=%d\n",sizeof(*pb));
      printf("size of pb=%d\n",sizeof(pb));
      
      return 0;
}

人造人 发表于 2021-4-18 15:43:01

这两个地址不连续分配吗?
哪本书上说过变量的地址是连续分配的吗?

因为你的系统是64位的,64位系统指针是8个字节

人造人 发表于 2021-4-18 15:45:06

可是560与567相差6个字节
7减0等于6

人造人 发表于 2021-4-18 15:53:45

添加了调试选项以后地址不在连续
$ cat main.c
#include <stdio.h>

int main()
{
    int a = 100;
    int b = 10;
    printf("%p\n", &a);
    printf("%p\n", &b);
    return 0;
}
$ gcc -g -Wall -o main main.c
$ ./main
0x7fff61194530
0x7fff61194534
$ gcc -g -Wall -fsanitize=address -o main main.c
$ ./main
0x7ffec42dd770
0x7ffec42dd780
$

教材完全解毒 发表于 2021-4-18 19:29:43

参考一下:
变量的内存地址相对于栈底的地址是不变的。所以,如果你计算任意两个变量的地址的差都是不变的,前提是你没有重新编译。

而开始时,栈是由操作系统分配给你的线程的,所以,他分配给线程的栈的首地址是不同的,所以变量的地址跟着不同。
指针大小与电脑有关
页: [1]
查看完整版本: P21:指针 非作业的答疑