鱼C论坛

 找回密码
 立即注册
查看: 1691|回复: 2

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

[复制链接]
发表于 2013-3-20 19:56:28 | 显示全部楼层 |阅读模式
50鱼币

                               
登录/注册后可看大图
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=>48  48 =32+16.
48=32+16 . 32*8=256 = 1 0000 0000  , 16*8=1000 0000  , 如果是16位来说,第一个是进位,值为0,第二个补码是0.
这并不是所谓的 垃圾值啊?
是为了兼容 x8086吗?   
有关 这些的细节 和具体应用是什么?


最佳答案

查看完整内容

未使用和未被分配内存地址中的垃圾数据:我是这样理解的=》未使用是你申请了一个变量 却没有初始化,那么这个变量的值是个随机数,那么对于我们来说就是垃圾数据。未被分配的内存地址是值你没有标记的内存(没有申请的内存),你申请了一个变量int i,那么后面的内存就是未分配的内存。但是可以用 &i+1来表示 查看这块内存的值*(&i+1)也会是个随机数。 地址p=0018FF44 //printf("地址p=%p \n",p); ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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进制的值,一般用来表示地址的。     

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









想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-3-22 19:06:08 | 显示全部楼层
思无邪 发表于 2013-3-22 11:01
未使用和未被分配内存地址中的垃圾数据:我是这样理解的=》未使用是你申请了一个变量 却没有初始化,那么这 ...

谢谢. 那个 我用 %p. 是当 打印补码用 .{:7_163:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-7 22:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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