一道C语言题目,把具有n个元素的数组循环右移k位,要用指针,大神看看我哪里错了,谢谢。

#include<stdio.h>voidmove(int*a,intn){int*p,*ad,t,*adx;ad=a+n;adx=a+n-1;t=*adx;for(;a... #include<stdio.h>
void move(int *a,int n)
{
int *p,*ad,t,*adx;
ad=a+n;
adx=a+n-1;
t=*adx;
for(;ad>a;--ad)
{
p=ad-1;
*ad=*p;
}
*a=t;
}
void rotate(int *a,int n,int k)
{
int i;
for(i=0;i<k;i++)
move(a,n);
}
main()
{
int a[8],i,k;
scanf("%d",&k);
for(i=0;i<8;i++)
scanf("%d",&a[i]);
rotate(a,8,k);
for(i=0;i<8;i++)
printf("%d,",*(a+i));
}
这样运行完结果是对的,但是程序崩溃了,求原因啊。
展开
 我来答
White_MouseYBZ
2014-04-15 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6660万
展开全部
你换个编译器或许能掩盖问题,但没有解决问题。你很随意地写了个ad=a+n;然后就用
p=ad-1;*ad=*p;把*(ad-1)赋给*ad。要知道ad=a+n是数组最后一个元素之后的单元,你并没有声明为你的代码所有就往里写数据,系统自然要告警。这种错误很隐蔽,也很危险;怎么改自己想办法。我可以告诉你个办法验证上述机理的正确性:在int a[8]的a[8]前加一个变量x,写成int x=3,a[8],i,k;把a[8](原来是a[0]~a[7],没有a[8])的位置占住,留给*ad=*p;用。这样肯定就不会崩溃了。
shenwei34
2014-04-15
知道答主
回答量:3
采纳率:0%
帮助的人:2.9万
展开全部
move 函数第二行出错。ad 的地址已出了数组边界,使得内存被破坏,使得程序崩溃。而且程序也是错的。应该改成ad = a+n-1;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
kaixingui2012
2014-04-15 · TA获得超过4.2万个赞
知道大有可为答主
回答量:1.4万
采纳率:81%
帮助的人:6457万
展开全部
调试了一下,代码没有问题啊,不会是你的编译器有问题吧? 你用的是哪个编译工具?VC?DEVC++?
更多追问追答
追问
我用的是visual c++ 6.0,以前编的都没有问题的啊
追答

你换个编译器试试,vc在win7  win8上有时就是有问题,我用devC++测试了,没有问题,代码也分析了,没有问题

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式