如何在我的 do-while 循环中解决此分段错误?

Posted

技术标签:

【中文标题】如何在我的 do-while 循环中解决此分段错误?【英文标题】:How to resolve this segmentation fault inside my do-while loop? 【发布时间】:2020-04-06 15:22:23 【问题描述】:

您必须将最多 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;

【问题讨论】:

这是一个学习使用debugger的好机会。 "从单行中输入"您的程序不遵守该要求,值可以放置在任意数量的行中 您确定要再次初始化sum=0 吗?您将始终进入if 分支,并且只保留sum 中的最后一个元素。 【参考方案1】:

我的 do while 循环出现分段错误

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

list[index] = w;

你觉得index的价值是什么?

你没有用值初始化它,它可能应该是0

因此,访问list[index] 是未定义的行为。在您的情况下,它导致了分段错误。

然后在for(i = 0;i &lt; ((sizeof(list)/sizeof(list[0]))+1);i++)里面

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

解决方案:

    在执行list[index] = w;之前执行一次index = 0;(初始化)

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

但最好改一下

for(i = 0;i &lt; ((sizeof(list)/sizeof(list[0])));i++)

for (i = 0; i &lt; 15; ++i)

因为您已经知道list 的大小,如果有15 个权重,list[15] 保证为-1。所以,你只需要遍历到list[14]

这只是消除了段错误,但您的代码中还有其他问题。

我想知道为什么代码不起作用,然后解决问题 我自己的。

你的 for 循环中的逻辑是错误的。

sum =0;
if(sum <= 50)

此条件始终为真,并且永远不会执行增加 t 值的 else 块。因此,输出始终是您分配给t 的初始值。

【讨论】:

评论不用于扩展讨论;这个对话是moved to chat。【参考方案2】:

首先你使用了一个未初始化的变量index 使用index=0

也如问题所说 a maximum of 15 different ,但您使用的是 ((sizeof(list)/sizeof(list[0]))+1) ,除了 +1 在它的末尾,这将导致通过数组的边界,这将导致未定义的行为,这是错误的,因为您将完全遍历数组,而array 中的元素可能较少。您应该在扫描数据时添加一个计数器,并且您的第二个循环应该基于此。

您的代码也与问题不同,如果输入始终为0 &lt; input &lt;= 50,您将永远不会输入else statement(t++),您将始终打印0。您正在找到sum 的权重而不是它们的数量,并且使用有问题的输入解释,您将始终打印t=0

【讨论】:

感谢您的宝贵时间,我猜 sizeof 不是最明智的做法。

以上是关于如何在我的 do-while 循环中解决此分段错误?的主要内容,如果未能解决你的问题,请参考以下文章

WHILE 和 DO-WHILE 循环未执行并卡在输出[关闭]

如何在 Java 中的每个 do-while 循环实例上存储数据?

来自 for 循环的分段错误

如何解决此分段错误:以下代码的 11 错误?

如何删除我的 C++ 代码中的分段错误?

如何防止我的程序出现此分段错误(核心转储)?