不行吗
----------------解决方案--------------------------------------------------------
我明白了,
printf("%s", &s);
传入s的起始地址给printf()函数,
再从起始地址开始,按每一个字节打印一个字母,
每一个字节存放一个两位的16进制的数,
而在8086系列机上,主存堆栈是向上生长的结构,
所以存放的结构是:
0x79 <---Top
0x70
0x70
0x61
0x68 <---Bottom
打印的时侯就是按字母的ASCII 打印,
但int 类型所占的空间是二个字节
long 类型所占的空间是四个字节,
所以题目得改一下:
#include <stdio.h>
main()
{
struct {long int m; int n;} s = {0x70706168, 0x79};
printf("%s", &s);
}
----------------解决方案--------------------------------------------------------
1个字节存一个2位的16进制?在所有机器上都是这样的吗?
----------------解决方案--------------------------------------------------------
一位16进制的数相当于4位二进制的数,
二位16进制的数就相当于8位二进制的数,
一个8位二进制的数就是一个字节了!
----------------解决方案--------------------------------------------------------
我明白了,
printf("%s", &s);
传入s的起始地址给printf()函数,
再从起始地址开始,按每一个字节打印一个字母,
每一个字节存放一个两位的16进制的数,
而在8086系列机上,主存堆栈是向上生长的结构,
所以存放的结构是:
0x79 <---Top
0x70
0x70
0x61
0x68 <---Bottom
打印的时侯就是按字母的ASCII 打印,
但int 类型所占的空间是二个字节
long 类型所占的空间是四个字节,
所以题目得改一下:
#include <stdio.h>
main()
{
struct {long int m; int n;} s = {0x70706168, 0x79};
printf("%s", &s);
}
还要注意字符串的输出%s,是一直打印到第一个'\0'出现。
依样画葫芦再想想这个'\0'出现的原因就解释全了。
另;int在很多编译器上都是4个字节,我见过的好象就tc内核的是2个字节。
----------------解决方案--------------------------------------------------------
#include <stdio.h>
int main()
{
struct {int m; int n;} s = {0x70706168, 0x79};
printf("%s", &(s.m));
return 0;
}
呵呵!这个结果是一样的!也要像那样解释吗?
----------------解决方案--------------------------------------------------------
%s要一直打印到遇到'\0'才结束。
s = {0x70706168, 0x0079};便是这'\0'.
----------------解决方案--------------------------------------------------------
m,n 在这起个什么作用?
指教....
----------------解决方案--------------------------------------------------------
呵呵!意思就是打印m之后没有停止,接着打印n,直到遇到00为止,呵呵,谢谢师兄了!
----------------解决方案--------------------------------------------------------
楼上说得对。
----------------解决方案--------------------------------------------------------