簡體   English   中英

已解決:使用 Do While 和 For 的例程會產生未知錯誤 GCC 核心轉儲(段錯誤)

[英]Solved: Routine with Do While and For make a unknow error GCC Core dump (Segment fault)

使用 GCC(Linux 或 Windows 或在線測試編譯器)編譯此程序后,每次運行時都會以不同的方式失敗。 我不明白我在哪里犯了錯誤。

在 Ubuntu Linux 上,程序在沒有打印答案的情況下崩潰。

在 Windows 10 (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;
}

它有什么問題?

1.不要使用未初始化的變量,你應該初始化totale

2.不要傳遞數組的邊界,否則會導致未定義的行為。

在此聲明中float riga[1][3]; ,第一個維度只有一個元素。你在這里的增量codice++; 無效,你沒有riga[1][num]你只有 riga riga[0][num] 。所以刪除這行codice++; 並檢查您的 while 條件,即您不會為數組的第二維掃描超過3元素。

這里

for ( calcolo = 1; calcolo < (codice + 1); calcolo++){
    totale = totale + (riga[calcolo][prezzo] * riga[calcolo][quanti]);
}

你再次通過數組的邊界。 calcolo只能為零。

正如@John Bollinger 所說的關於 arrays 的基本觀點:它們從 0 開始索引,而不是從 1 開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM