问题描述
我正在尝试为程序编写逻辑,在实现时我遇到了分段错误。有人能告诉我这个错误的原因吗。
#include<stdio.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m,s;
scanf("%d %d %d",&n,&m,&s);
int a[n],i,j=s;
for(i=1;i<=n;i++)
a[i]=0;
int ind=0;
while(m>0)
{
a[j]=a[j]+1;
ind=j;
if ((j+1)%n==0)
j=1;
else
j=(j+1)%n;
m=m-1;
}
printf("%d\n",ind);
}
}
解决方法
在 C 中的数组声明中指定的数字是元素的数量,而不是最大索引。 C 中的数组索引从零开始。
因此,
int a[n],i,j=s;
for(i=1;i<=n;i++)
a[i]=0;
很糟糕,因为它向超出范围的 a[n]
写入了一些内容。
如果您想使用来自 a[1]
而不是 a[0]
的元素,请再分配一个元素以避免超出范围的访问。