[英]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.