已解决:带有Do While和For的例程生成未知错误GCC核心转储(段故障)
使用GCC(Linux或Windows或联机测试编译器)编译此程序后,每次运行时都会以不同的方式失败。我不明白我在哪里犯的错误 在Ubuntu Linux上,程序在没有打印答案的情况下崩溃 在Windows10(MSYS)上,它无限循环,不打印任何消息 在我试过的一个在线编译器上,它失败了,出现了一个分段错误(以及核心转储和退出代码139) 代码如下:已解决:带有Do While和For的例程生成未知错误GCC核心转储(段故障),c,gcc,C,Gcc,使用GCC(Linux或Windows或联机测试编译器)编译此程序后,每次运行时都会以不同的方式失败。我不明白我在哪里犯的错误 在Ubuntu Linux上,程序在没有打印答案的情况下崩溃 在Windows10(MSYS)上,它无限循环,不打印任何消息 在我试过的一个在线编译器上,它失败了,出现了一个分段错误(以及核心转储和退出代码139) 代码如下: #include <stdio.h> int main() { float riga[1][3]; int ciclo
#include <stdio.h>
int main() {
float riga[1][3];
int ciclo = 2;
int calcolo;
float totale;
int codice = 0;
int quanti = 1;
int prezzo = 2;
printf("\n Inserendo una quantita pari a 0 si conclude con il totale");
do {
codice++;
printf("\n Numero: %d Inserire la quantita:", codice);
scanf("%f", &riga[codice][quanti]);
if ( riga[codice][quanti] < 1 ){
printf("\n Calcolo del totale.");
ciclo = 1;
} else {
printf("\n Numero: %d Inserire il prezzo:", codice);
scanf("%f", &riga[codice][prezzo]);
}
//printf("\n Quantita: %f Prezzo: %f", riga[codice -1][quanti], riga[codice -1 ][prezzo]);
//printf("\n Ciclo = %d", ciclo);
} while( ciclo != 1 );
printf("\n Totale in calcolo");
for ( calcolo = 1; calcolo < (codice + 1); calcolo++){
//printf("\n Prezzo = %f",riga[calcolo][prezzo] );
totale = totale + (riga[calcolo][prezzo] * riga[calcolo][quanti]);
}
printf("\n Totale: %f", totale);
return 0;
}
#包括
int main(){
浮动里加[1][3];
int-ciclo=2;
内特卡尔科洛;
浮点数;
int codice=0;
int-quanti=1;
int prezzo=2;
printf(“\n不包含任何数量的总和”);
做{
codice++;
printf(“\n数字:%d插入数量:”,代码);
scanf(“%f”、&riga[codice][quanti]);
if(里加[密码][数量]<1){
printf(“\n Calcolo del totale.”);
ciclo=1;
}否则{
printf(“\n编号:%d插入前言:”,密码);
scanf(“%f”和里加[codice][prezzo]);
}
//printf(“\n数量:%f前缀:%f”,riga[codice-1][quanti],riga[codice-1][Prezzo]);
//printf(“\n Ciclo=%d”,Ciclo);
}而(ciclo!=1);
printf(“\n总计单位:calcolo”);
对于(calcolo=1;calcolo<(codice+1);calcolo++){
//printf(“\n Prezzo=%f”,riga[calcolo][Prezzo]);
totale=totale+(riga[calcolo][prezzo]*riga[calcolo][quantity]);
}
printf(“\n总计:%f”,总计);
返回0;
}
有什么问题吗?1.不要使用未初始化的变量,应该初始化
totale
2.不要通过数组的边界,否则会导致未定义的行为
在此声明中float riga[1][3]代码>,第一维度只有一个元素。此处的增量codice++代码>无效。您没有riga[1][num]
您只有riga[0][num]
。因此请删除此行codice++
并检查while条件,即对于数组的第二维度,不能扫描超过3个
元素
这里
for(calcolo=1;calcolo<(codice+1);calcolo++){
totale=totale+(riga[calcolo][prezzo]*riga[calcolo][quantity]);
}
同样,您正在通过数组的边界<代码>calcolo
只能为零
正如@John Bollinger所说的关于数组的基本观点:它们是从0而不是从1索引的。请正确缩进代码。riga[codice][quanti]
仅在codice
为0
时有效,因为第一个维度只有1个元素,但是你在循环中将codice
增加到1
。关于数组的基本点:它们是从0索引的,而不是从1索引的。天哪,我读了很多次代码都没有意识到错误是如此明显,非常感谢Mutch@ExagonX请随意不需要谢谢,但如果这有帮助,请接受答案。嗨,当我发布答案时,有时我看到源代码中有不同的颜色,有时所有代码都是灰色的,你知道我要如何用不同的颜色显示代码吗?@ExagonX不,实际上这也是我的问题,我也是这个网站的新用户。
for ( calcolo = 1; calcolo < (codice + 1); calcolo++){
totale = totale + (riga[calcolo][prezzo] * riga[calcolo][quanti]);
}