分析c语言的运行结果?
3个回答
展开全部
没碰到这样用的,这个只能出现在“深度剖析”里面,我们就根据结果“剖析”一下吧,我把程序修改一下:
#include <stdio.h>
int main()
{
int i;
int a[5]=;
int *ptr1=(int *)(&a+1);
int *ptr2=(int *)((int)a+1);
char *p = (char *)((int)a);
printf("%x,%x\n",ptr1[-1],*ptr2);
for(i=0;i<20;++i)
printf("%x ",*(p++));
}
这样输出结果是:
5,2000000
1 0 0 0 2 0 0 0 3 0 0 0 4 0 0 0 5 0 0 0
先来看ptr1,&a是指向a[5]数组的头,&a+1指向哪里呢?如果我们把a[5]定义成a[2][5]我们就可以确定&a+1应该是指向a[1][0],是a[0][4]后面的一个单元,根据程序的运行结果,可以确定&a+1应该就是把a[5]像a[2][5]一样处理的,即&a+1指向了a[4]后面的一个单元,所以ptr1[-1]=*(ptr1-1)=5
想明白ptr2的值,应该看我增加的输出。(int)a先把a转化成int型,然后(int)a+1就是像int型一样处理了,这里的+1当然是向前增加一个字节喽,所以(int)a+1应该指向:
1 0 0 0 2 0 0 0 3 0 0 0 4 0 0 0 5 0 0 0
^
(int*)又告诉编译器(int)a+1要按照int型指针处理,所以*ptr2指向的内存块的内容应该是:
00 00 00 02
按照C对int型在内存的存储方式,这个值就是
2000000
补充一点儿:我用的是win7 64位操作系统,int型占4个字节的
#include <stdio.h>
int main()
{
int i;
int a[5]=;
int *ptr1=(int *)(&a+1);
int *ptr2=(int *)((int)a+1);
char *p = (char *)((int)a);
printf("%x,%x\n",ptr1[-1],*ptr2);
for(i=0;i<20;++i)
printf("%x ",*(p++));
}
这样输出结果是:
5,2000000
1 0 0 0 2 0 0 0 3 0 0 0 4 0 0 0 5 0 0 0
先来看ptr1,&a是指向a[5]数组的头,&a+1指向哪里呢?如果我们把a[5]定义成a[2][5]我们就可以确定&a+1应该是指向a[1][0],是a[0][4]后面的一个单元,根据程序的运行结果,可以确定&a+1应该就是把a[5]像a[2][5]一样处理的,即&a+1指向了a[4]后面的一个单元,所以ptr1[-1]=*(ptr1-1)=5
想明白ptr2的值,应该看我增加的输出。(int)a先把a转化成int型,然后(int)a+1就是像int型一样处理了,这里的+1当然是向前增加一个字节喽,所以(int)a+1应该指向:
1 0 0 0 2 0 0 0 3 0 0 0 4 0 0 0 5 0 0 0
^
(int*)又告诉编译器(int)a+1要按照int型指针处理,所以*ptr2指向的内存块的内容应该是:
00 00 00 02
按照C对int型在内存的存储方式,这个值就是
2000000
补充一点儿:我用的是win7 64位操作系统,int型占4个字节的
展开全部
虽然我没有看到你的 C 程序,但是我要非常认真地告诉你:C 程序的运行结果是要在 C 编译环境中设置断点、单步跟踪检查出来的,而不是在纸上看程序看出来的。你采用我的方法试试看,应该能够找出程序错误所在。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你懂调试不? 把调试弄懂再说吧
追问
懂啊 结果都出来了,老师要求分析其运行结果,不知道怎么着手分析
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询