为什么这些代码给我一个运行时SIGSEGV错误。我试过运行代码,并且在代码块中工作得很好,但是一些IDE给了我这些错误。
它取一个斐波那契级数,然后对级数中的每个数字取模,只取前几位的数字,直到得到一个单独的数字。
例如:input 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;
}我想知道代码中的哪个点触发了这个错误,我对这些错误知之甚少(比如访问绑定以外的数组),你能给我解释一下吗?
发布于 2019-09-07 13:43:25
第一次访问k变量时,k变量未初始化
r=k;
int e[k/2];这意味着它等于之前存储在该内存位置的任何内容。这可能是任何随机数,这是非常糟糕的。
在下一行中,您声明了一个大小为k/2的数组e[k/2],但由于k从未初始化过,因此它可以是任何大小。如果k恰好是负的,我会在这一行得到一个分段错误。
要解决此问题,您需要在使用所有变量之前对其进行初始化。
如果您试图访问未由操作系统分配给程序的内存,则会发生分段错误(SIGSEGV)。
若要帮助调试这些错误,请在调试器中运行代码。然后,这可以将您直接带到发生分段错误的行。
发布于 2019-09-07 13:56:02
只需将scanf("%d",&k);放在r=k;之上
信号是由无效的内存引用或分段故障引起的错误(信号)。您可能正在尝试访问越界的数组元素,或者试图使用过多的内存。
还有。我不确定else语句中的return 0;。我没有运行代码,所以我可能弄错了,但它应该是return 1;而不是return 0;
if(j!=0)
{
if(j%2!=0)
{
e[m]=i[j];
m++;
}
}您可以将其替换为if(j != 0 && j%2 != 0)
发布于 2019-09-08 11:12:23
我知道你说的这个问题...这不是你该怎么解决的..。你必须找到在O(1)时间内剩下的数字...由于奇数位正在被移除,我们只需担心偶数位……现在,这些偶数位可能会变得奇数,当除以两个重复…因此,有固定数量的步骤来将整个数组转换为单个元素...在这一步的每个点上,偶数被2除,因此在这些步骤之间或之后,将只有一个偶数不会变成奇数……你必须通过查看N来找到这个数字,至少我也是这样做的。这只是一个提示,如果不清楚,我可以在评论中解释更多的逻辑…赞成票
https://stackoverflow.com/questions/57830549
复制相似问题