一道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));
}
这样运行完结果是对的,但是程序崩溃了,求原因啊。 展开
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));
}
这样运行完结果是对的,但是程序崩溃了,求原因啊。 展开
3个回答
展开全部
你换个编译器或许能掩盖问题,但没有解决问题。你很随意地写了个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;用。这样肯定就不会崩溃了。
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;用。这样肯定就不会崩溃了。
展开全部
move 函数第二行出错。ad 的地址已出了数组边界,使得内存被破坏,使得程序崩溃。而且程序也是错的。应该改成ad = a+n-1;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询