不行吗
2007-01-06 23:10
我明白了,
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);
}

2007-01-07 11:13
2007-01-07 11:22

2007-01-07 11:38
我明白了,
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个字节。

2007-01-07 13:25
#include <stdio.h>
int main()
{
struct {int m; int n;} s = {0x70706168, 0x79};
printf("%s", &(s.m));
return 0;
}
呵呵!这个结果是一样的!也要像那样解释吗?

2007-01-07 13:59
2007-01-07 14:04
2007-01-07 14:09
2007-01-07 14:09
2007-01-07 14:11