已解决:带有Do While和For的例程生成未知错误GCC核心转储(段故障)

已解决:带有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

使用GCC(Linux或Windows或联机测试编译器)编译此程序后,每次运行时都会以不同的方式失败。我不明白我在哪里犯的错误

在Ubuntu Linux上,程序在没有打印答案的情况下崩溃

在Windows10(MSYS)上,它无限循环,不打印任何消息

在我试过的一个在线编译器上,它失败了,出现了一个分段错误(以及核心转储和退出代码139)

代码如下:

#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]);
}