鱼C论坛

 找回密码
 立即注册
查看: 828|回复: 4

[已解决]P21:指针 非作业的答疑

[复制链接]
发表于 2021-4-18 15:11:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
按照老师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    //疑问:同上

  1. #include <stdio.h>

  2. int main()
  3. {
  4.         char a='F';
  5.         int b=123;
  6.         
  7.         char *pa=&a;
  8.         int *pb=&b;
  9.         
  10.         printf("a=%c\n",*pa);   //打印指针地址指向的值,即a
  11.                 printf("a=%d\n",pa);    //打印指针地址,十进制
  12.                 printf("a=%d\n",*pb);
  13.                 printf("a=%d\n",pb);
  14.                
  15.                 printf("size of pa=%d\n",sizeof(*pa));   //打印a的size
  16.         printf("size of pa=%d\n",sizeof(pa));    //打印指针变量pa的size
  17.         printf("size of pb=%d\n",sizeof(*pb));
  18.         printf("size of pb=%d\n",sizeof(pb));
  19.         
  20.         return 0;
  21. }
复制代码


最佳答案
2021-4-18 15:43:01
这两个地址不连续分配吗?
哪本书上说过变量的地址是连续分配的吗?

因为你的系统是64位的,64位系统指针是8个字节
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-4-18 15:43:01 | 显示全部楼层    本楼为最佳答案   
这两个地址不连续分配吗?
哪本书上说过变量的地址是连续分配的吗?

因为你的系统是64位的,64位系统指针是8个字节
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-18 15:45:06 | 显示全部楼层
可是560与567相差6个字节
7减0等于6
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-18 15:53:45 | 显示全部楼层
添加了调试选项以后地址不在连续
  1. $ cat main.c
  2. #include <stdio.h>

  3. int main()
  4. {
  5.     int a = 100;
  6.     int b = 10;
  7.     printf("%p\n", &a);
  8.     printf("%p\n", &b);
  9.     return 0;
  10. }
  11. $ gcc -g -Wall -o main main.c
  12. $ ./main
  13. 0x7fff61194530
  14. 0x7fff61194534
  15. $ gcc -g -Wall -fsanitize=address -o main main.c
  16. $ ./main
  17. 0x7ffec42dd770
  18. 0x7ffec42dd780
  19. $
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-18 19:29:43 | 显示全部楼层
参考一下:
变量的内存地址相对于栈底的地址是不变的。所以,如果你计算任意两个变量的地址的差都是不变的,前提是你没有重新编译。

而开始时,栈是由操作系统分配给你的线程的,所以,他分配给线程的栈的首地址是不同的,所以变量的地址跟着不同。
指针大小与电脑有关
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-30 03:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表