如何在我的 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 < ((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 < ((sizeof(list)/sizeof(list[0])));i++)
到
for (i = 0; i < 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 < input <= 50
,您将永远不会输入else statement
(t++
),您将始终打印0
。您正在找到sum
的权重而不是它们的数量,并且使用有问题的输入解释,您将始终打印t=0
。
【讨论】:
感谢您的宝贵时间,我猜 sizeof 不是最明智的做法。以上是关于如何在我的 do-while 循环中解决此分段错误?的主要内容,如果未能解决你的问题,请参考以下文章
WHILE 和 DO-WHILE 循环未执行并卡在输出[关闭]