[英]Qt Program crashes with another compiler
誰能告訴我這部分代碼有什么問題嗎? 執行期間崩潰。
void MainWindow::on_pushButton_clicked()
{
char * cstr = new char [ui->lineEdit->text().length()];
string costam;
costam=ui->lineEdit->text().toStdString();
strcpy(cstr, costam.c_str()); <<<----TROUBLE LINE
int z;
z=costam.length();
for(int n=0;n<z;n++){
string wynik;
wynik=konwersja(cstr[n]);
mors(wynik);
Sleep(300);
}
delete[] cstr;
}
當我嘗試在Qt 5.0.1中使用MinGW進行編譯時,一切正常,但是在Qt 4.8.1中使用MSVC2010進行編譯時,出現警告:
警告C4996:'strcpy':此函數或變量可能不安全。 考慮改用strcpy_s。 要禁用棄用,請使用_CRT_SECURE_NO_WARNINGS。 詳細信息請參見在線幫助。
您的問題是錯的。 這段代碼可以編譯,這里沒有關於QT的內容。
不建議使用strcpy
,因為它不安全。 替代方法是strcpy_s
:
strcpy_s( cstr, ui->lineEdit->text().length() + 1, costam.c_str() );
請注意,您應該分配ui->lineEdit->text().length() + 1
,而不是ui->lineEdit->text().length()
。 我猜這就是崩潰的原因。
順便說一句,我認為根本沒有理由在您的代碼中使用cstr
數組。 例如:
void MainWindow::on_pushButton_clicked() {
string costam;
costam = ui->lineEdit->text().toStdString();
for( size_t n = 0; n < costam.length(); n++ ) {
string wynik;
wynik = konwersja( costam[ n ] );
mors( wynik );
Sleep( 300 );
}
}
您可以更改此行嗎? strcpy(cstr, costam.c_str());
與strcpy_s(cstr, costam.c_str());
嘗試再次編譯?
同樣,它也不應該阻止編譯,MSVC2010只是警告使用不安全。 您還可以降低MSVC2010的警告級別。
由於人們在編程C ++時並不十分了解安全性,並且Windows對此表示不滿,因此Visual Studio“棄用了”幾個導致緩沖區溢出的常見功能。 在這種情況下,您應該沒問題,並且可以通過定義_CRT_SECURE_NO_WARNINGS禁用警告。 posix函數也可能會出現此問題,在這種情況下,您可以使用單獨的#define禁用這些警告。
您在這里有兩個問題。
崩潰是因為strcpy會將length + 1
字符寫入目標緩沖區,但是您的緩沖區只有size length
。 +1是空終止符,不包含在length
。
警告是因為Microsoft認為使用strcpy容易出錯並且不鼓勵使用它。 如Joel所述,您可以啟用一個定義來防止該警告。 我不建議使用semihyagcioglu和Microsoft建議使用strcpy_s,因為它不是便攜式解決方案。
我還想指出,修復這些問題將使您的代碼得以編譯和運行而不會出錯,但還有其他問題。 就像:為什么首先需要cstr變量? cstr [n]可能可以替換為costam.data()[n]。 然后,cstr變量根本不需要存在。 您將不需要new,delete或strcpy。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.