我在while循环中遇到分段错误

问题描述 投票:0回答:1

您最多只能将15个不同的负载从一个端口运输到另一个端口。运送这些货物的货船的载重量为50吨。枚举载荷,有关每个载荷重量的信息作为输入。

假设每个负载的重量小于或等于50吨且大于0。

您将在一行中从输入中读取每个负载的重量。您的输入将以-1结尾。您将打印必要的旅行次数。

样本输入:

50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 -1

输出:

15  

但是出现此错误,并且每当我向程序提供输入时

./vpl_execution: line 5: 15093 Bus error               (core dumped) ./main

通过我对这种情况的了解,我认为我并没有超出数组索引或使用了错误的指针。另外,我在这里看到了具有解决方案的相同问题,但我想知道为什么代码无法正常工作,然后自己解决问题。非常感谢您的帮助。

#include <stdio.h>
int main()
{   int w,i,t,sum,index;
    int list[16];
    w = 1;
    do
    {   
        scanf("%d",&w);
        list[index] = w;
        index++;
    }while(w >= 0);
    t = 0;
    for(i = 0;i < ((sizeof(list)/sizeof(list[0]))+1);i++)
    {
        sum =0;
        if(sum <= 50)
        {sum += list[i];}
        else
        {t++;}
    }

    printf("%d",t);
    return 0;
}
c segmentation-fault knapsack-problem
1个回答
0
投票

第一个分段错误发生在此行:

list[index] = w;

您认为index的值是什么?

您未使用值进行初始化,该值可能应该为0

因此,访问列表[index]相对于list是未定义的行为,超出范围。就您而言,它导致了分段错误。

然后在for(i = 0;i < ((sizeof(list)/sizeof(list[0]))+1);i++)

此处访问list[i]可能会在i的最后一个值处引起另一个段错误。您应该从+1]中删除((sizeof(list)/sizeof(list[0]))+1)

解决方案:

  1. int w,i,t,sum,index;更改为int w,i,t,sum,index = 0;

  2. +1中删除((sizeof(list)/sizeof(list[0]))+1)

  3. Aside:

这只是删除了段错误,逻辑错误可能仍然保留在您的代码中。


0
投票

首先,您使用了未初始化的变量index,请使用index=0

© www.soinside.com 2019 - 2024. All rights reserved.