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;
}
这两个地址不连续分配吗?
哪本书上说过变量的地址是连续分配的吗?
因为你的系统是64位的,64位系统指针是8个字节
可是560与567相差6个字节
7减0等于6 添加了调试选项以后地址不在连续
$ 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
$
参考一下:
变量的内存地址相对于栈底的地址是不变的。所以,如果你计算任意两个变量的地址的差都是不变的,前提是你没有重新编译。
而开始时,栈是由操作系统分配给你的线程的,所以,他分配给线程的栈的首地址是不同的,所以变量的地址跟着不同。
指针大小与电脑有关
页:
[1]