坦_然 发表于 2013-3-20 19:56:28

关于 未使用和未被分配 内存地址中的 "垃圾值"求教.


http://bbs.fishc.com/forum.php?mod=attachment&aid=MTAyNzV8ZWQ0MDM5MGJ8MTM2Mzc4MDMwNXwyMjkwOTl8MjkwMDc%3D&noupdate=yes 5 小时前 上传
下载附件 (19.54 KB)



#include <stdio.h>
#include <stdlib.h>void bj(int *);int main(void){ int i=1;bj(&i);
system("PAUSE");return 0;}
void bj(int *p){printf("地址p=%p \n",p);printf("右值*p=%p \n",*p);printf("*(p++)=%p\n",*(p++));printf("地址p=%p \n",p);printf("右值*p=%p \n",*p);printf("++*p=%p\n",++*p);printf("地址p=%p \n",p);printf("右值*p=%p \n",*p);}32位系统.0X0022FF78-0X0022FF48=0X30=>4848 =32+16. 48=32+16 . 32*8=256 = 1 0000 0000, 16*8=1000 0000, 如果是16位来说,第一个是进位,值为0,第二个补码是0.这并不是所谓的 垃圾值啊?是为了兼容 x8086吗?   有关 这些的细节 和具体应用是什么?


思无邪 发表于 2013-3-20 19:56:29

未使用和未被分配内存地址中的垃圾数据:我是这样理解的=》未使用是你申请了一个变量 却没有初始化,那么这个变量的值是个随机数,那么对于我们来说就是垃圾数据。未被分配的内存地址是值你没有标记的内存(没有申请的内存),你申请了一个变量int i,那么后面的内存就是未分配的内存。但是可以用 &i+1来表示 查看这块内存的值*(&i+1)也会是个随机数。
地址p=0018FF44         //printf("地址p=%p \n",p);                      打印P的地址      0018FF44
右值*p=00000001       //printf("右值*p=%p \n",*p);                   打印P的值          1
地址P-1=0018FF40   //printf("地址p-1=%p \n",p-1);                打印P-1的地址0018FF40右值(P-1)= cccccccc   //printf("右值*(p-1)=%p \n",*(p-1));       打印*(P-1)的值 cccccccc
*(p++)=00000001      //printf("*(p++)=%p\n",*(p++));         打印*(P++)的值 实际是两步:打印P的值 , P=P+1
地址p=0018FF48         //printf("地址p=%p \n",p);                      打印P的地址P =0018FF44 +sizeof( int ) = 0018FF48   
右值*p=0018FF88       //printf("右值*p=%p \n",*p);                  打印P的值 0018FF48 = 1638280
++*p=0018FF89         //printf("++*p=%p\n",++*p);                  打印++(*P) 的值 P = 1638281
地址p=0018FF48         //printf("地址p=%p \n",p);                     打印P的地址   0018FF48
右值*p=0018FF89       //printf("右值*p=%p \n",*p);                     打印P的值      1638281
*(p++)=0018FF89       //printf("*(p++)=%p\n",*(p++));         打印*(P++)的值 实际是两步:打印P的值 , P=P+1 地址p=0018FF4C         //printf("地址p=%p \n",p);                     打印P的地址 右值*p=00401449       //printf("右值*p=%p \n",*p);                     打印*P的值 00401449
我在电脑上测试的结果
红色的部分是我加的代码查 i 前面内存地址的值。后面的是查看后面地址的值。i 前面的地址是地址P-1=0018FF40    右值(P-1)= cccccccc   p-1没有使用也没有分配 其中的值是cccccccc随机数。后面的红色代码是查看 i 以后的内存的地址地址p=0018FF4C右值*p=00401449
小建议:你打印内存地址中的值可不可以用printf("右值*p=%d \n",*p);p是16进制的值,一般用来表示地址的。   

不知道有没有正确理解你的意思。   









坦_然 发表于 2013-3-22 19:06:08

思无邪 发表于 2013-3-22 11:01 static/image/common/back.gif
未使用和未被分配内存地址中的垃圾数据:我是这样理解的=》未使用是你申请了一个变量 却没有初始化,那么这 ...

谢谢. 那个 我用 %p. 是当 打印补码用 .{:7_163:}
页: [1]
查看完整版本: 关于 未使用和未被分配 内存地址中的 "垃圾值"求教.