为什么这些代码给我一个运行时 SIGSEGV 错误。我尝试运行代码并在代码块中完美运行,但某些 IDE 给了我这些错误。
它采用斐波那契数列,然后对数列中的每个数字取模,并且只取前几个位置的数字,直到获得单个数字。
例如:输入1 9 {0 1 1 2 3 5 8 13 21}->{0 1 1 2 3 5 8 3 1}->{1 2 5 3}->{2 3}->3
#include <stdio.h>
int main(void) {
// your code goes here
int n,j,k,r,o;
o=0;
// printf("enter the number of test cases: ");
scanf("%d",&n);
int s[n];
int a;
a=n;
while(n!=0)
{
r=k;
int e[k/2];
int m;
scanf("%d",&k);//enter say 9
if(k!=1)
{
int i[k];
i[0]=0;
i[1]=1;
for(j=0;j<k;j++)
{
if(j>1)
{
i[j]=(i[j-2]+i[j-1])%10;
}
}
while(r!=1)
{
m=0;
for(j=0;j<r;j++)
{
if(j!=0)
{
if(j%2!=0)
{
e[m]=i[j];
m++;
}
}
}
for(j=0;j<k/2;j++)
{
i[j]=e[j];
}
r=r/2;
}
s[o]=e[0];
o++;
n--;
}
else
{
return 0;
}
}
if(k!=1)
{
for(j=0;j<a;j++)
{
printf("%d\n",s[j]);
}
}
return 0;
}
我想知道代码中的哪一点触发了错误,我对这些错误知之甚少(例如访问超出键的数组),你能解释一下吗?
最佳答案
当您第一次访问它时,您的 k 变量尚未初始化
r=k;
int e[k/2];
这意味着它等于之前存储在该内存位置的任何内容。这可以是任何随机数,而且非常糟糕。
在下一行中,您声明一个大小为 k/2
的数组 e[k/2]
,但由于 k
从未初始化,这可以是任何大小。如果 k
恰好为负数,我会在该行收到段错误。
要解决此问题,您需要在使用所有变量之前对其进行初始化。
如果您尝试访问操作系统未分配给程序的内存,则会发生段错误 (SIGSEGV)。
为了帮助调试这些错误,请在调试器中运行代码。然后,这可以将您直接带到发生段错误的行。
关于c - 为什么这些代码给我一个 sigsegv 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57830549/