📄 subject_39821.htm
字号:
<p>
序号:39821 发表者:蓝蜻蜓 发表日期:2003-05-13 22:17:45
<br>主题:请问变量的存储方式
<br>内容:是不是变量一般都放在堆栈中的,<BR>和内存中的数据存储方式一样吗,我想知道。<BR>比如定义 WORD p,*point;<BR>p=0x0102;<BR>point=&p;<BR>point所指向的低地址放0x01还是0x02<BR>那么如果在内存中呢<BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:dr0 回复日期:2003-05-13 22:27:23
<br>内容:是不是变量一般都放在堆栈中的,<BR>和内存中的数据存储方式一样吗,我想知道。<BR>// yes. stack 也是内存的一部分。<BR><BR>point所指向的低地址放0x01还是0x02<BR>那么如果在内存中呢<BR>// 这个依赖一个机器字节顺序问题。在一般的Intel processor的PC<BR>// 上,低址存低字节,称为 little endian.<BR>// 所以 point 指向 0x02<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:dr0 回复日期:2003-05-13 22:43:14
<br>内容:Let me show u , see the red line and blue interpretion :<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:dr0 回复日期:2003-05-13 22:48:05
<br>内容:如果你用的机器是UNIX,并用的是SPARC, MIPS, 或者其他RISC芯片的主机<BR>可能看到的和此相反,他们通常是 big endian.<BR>the low address stores the high byte, while the high address stores the low byte.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:蓝蜻蜓 回复日期:2003-05-14 14:48:16
<br>内容:非常详细,真是太感谢了。<BR>我还想请教一下,我编了下面程序,<BR><BR><BR>#include "stdio.h"<BR>void main()<BR>{<BR> char *p1;<BR> short int p2=0x01a1;<BR> p1=(char *)p2;<BR> printf("%02x",*p1);<BR> p1=p1+1;<BR> printf("%02x",*p1);<BR>}<BR>想分别读出p2的高字节和低字节,可是编译通过了,<BR>但运行时却说内存错误,是不是只能用指针分别指向p2的高字节和低字节,<BR>但却不能调用它们。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:俊俊 回复日期:2003-05-14 16:17:18
<br>内容:#include "stdio.h"<BR>void main()<BR>{<BR> short int p2=0x01a1;<BR> printf("%02x ",(p2&0xff));<BR> printf("%02x",((p2>>8)&0xff));<BR>}<BR>这样就可以了!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:peppon 回复日期:2003-05-14 16:37:33
<br>内容:p1=(char*)(&p2);<BR><BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:dr0 回复日期:2003-05-14 19:42:42
<br>内容:#include "stdio.h"<BR>void main()<BR>{<BR> char *p1;<BR> short int p2 = 0x01a1;<BR> p1 = (char *)p2;<BR> printf("%02x",*p1);<BR> p1 = p1 + 1;<BR> printf("%02x",*p1);<BR>}<BR>// OS 对内存拥有无上的控制权,所以你的 0x01a1 是一相情愿的做法<BR>// 得到的内存可能不会让你在0x01a1读/写。所以你可以先向OS申请一块内存<BR>// 比如, short *p = (short *)malloc(sizeof(short)); <BR>// 然后再进行你的转化和dereference.<BR>// 尤其是在Windows上,低端的64K是专门用来捕捉NULL指针的,是连读都不能读的<BR>// 而你的0x01a1 < 0xFFFF (64K), 所以落在这个区域,被CPU捕获,造成运行时<BR>// 的错误。<BR>2003-5-14 19:44:37
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -