首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这些代码会给我一个sigsegv错误?

问为什么这些代码会给我一个sigsegv错误?
EN

Stack Overflow用户
提问于 2019-09-07 11:58:01
回答 3查看 129关注 0票数 0

为什么这些代码给我一个运行时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

代码语言:javascript
复制
#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;
}

我想知道代码中的哪个点触发了这个错误,我对这些错误知之甚少(比如访问绑定以外的数组),你能给我解释一下吗?

EN

回答 3

Stack Overflow用户

发布于 2019-09-07 13:43:25

第一次访问k变量时,k变量未初始化

代码语言:javascript
复制
r=k;
int e[k/2];

这意味着它等于之前存储在该内存位置的任何内容。这可能是任何随机数,这是非常糟糕的。

在下一行中,您声明了一个大小为k/2的数组e[k/2],但由于k从未初始化过,因此它可以是任何大小。如果k恰好是负的,我会在这一行得到一个分段错误。

要解决此问题,您需要在使用所有变量之前对其进行初始化。

如果您试图访问未由操作系统分配给程序的内存,则会发生分段错误(SIGSEGV)。

若要帮助调试这些错误,请在调试器中运行代码。然后,这可以将您直接带到发生分段错误的行。

票数 0
EN

Stack Overflow用户

发布于 2019-09-07 13:56:02

只需将scanf("%d",&k);放在r=k;之上

信号是由无效的内存引用或分段故障引起的错误(信号)。您可能正在尝试访问越界的数组元素,或者试图使用过多的内存。

还有。我不确定else语句中的return 0;。我没有运行代码,所以我可能弄错了,但它应该是return 1;而不是return 0;

代码语言:javascript
复制
if(j!=0)
{
      if(j%2!=0)
      {
            e[m]=i[j];
            m++;
      }
}

您可以将其替换为if(j != 0 && j%2 != 0)

票数 0
EN

Stack Overflow用户

发布于 2019-09-08 11:12:23

我知道你说的这个问题...这不是你该怎么解决的..。你必须找到在O(1)时间内剩下的数字...由于奇数位正在被移除,我们只需担心偶数位……现在,这些偶数位可能会变得奇数,当除以两个重复…因此,有固定数量的步骤来将整个数组转换为单个元素...在这一步的每个点上,偶数被2除,因此在这些步骤之间或之后,将只有一个偶数不会变成奇数……你必须通过查看N来找到这个数字,至少我也是这样做的。这只是一个提示,如果不清楚,我可以在评论中解释更多的逻辑…赞成票

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57830549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档