2016-07-20 22 views
-5

を生産、私はこれはおそらく、約1000回の話をされている基本的なものですけど、私は次のようにセグメンテーションフォールトを生成し、なぜ理解を助ける必要があると思う:C++のchar * [255]セグメンテーションフォールト

char* outputPath = new char[255]; 
sprintf(outputPath, "/home/istrab/iStrabGUI Output/%s/%s/0/Frames",patientName, techName); 

いくつかの研究の後で、配列のサイズを255と宣言したため、私が書きたい文字列を保持するのに十分な大きさになると思います。私はまた、それを書き込もうとする前に初期化されていることを確認しました。また、関連する変数がコードの初期に初期化されているか、プログラムがそれまでに終了していたかどうかを二重に確認しました。これについて別の方法がありますか?それは文字列自体か、配列を初期化する方法ですか?

このコードは、C++

+4

なぜ文字配列ではなく文字列オブジェクトを使用するのはなぜですか?あなたに頭痛の多くを救うでしょう。 – DeathTails

+2

'char outputPath [255]'はより慣用的なIMOになります。また、使用する必要のある最大パス長の定数/定義があります(他に何もない場合は移植性のために) –

+0

[ゼロの無限大ルール](https://en.wikipedia.org/wiki/Zero_one_infinity_rule)に既に違反しています。 – IInspectable

答えて

3

使用QStringとにかくのQtを使用している場合とします。それに

QString outputPath; 
outputPath.sprintf("/home/istrab/iStrabGUI Output/%s/%s/0/Frames", 
        patientName, 
        techName); 
+0

ありがとうございます。この方法を試したところ、問題は解決されました。 – Coliwack

0

VARSのpatientNameにはQt 4.8.6を使用して書かれた、techNameは問題である、あなたは大きく、オーバーフローしされることはありませんになるためにoutputPathのサイズを変更する使用する必要があります。

しかし、私は文字列ライブラリから文字列varを使用することを理解しようとします。 Look here

1

実行GDBをしてpatientNameとtechNameの値を印刷し、その後、その行のブレークを置きます。 2つのうちの1つがおそらくヌルです。

+0

問題の行に達する前に印刷コマンドを使用して印刷したため、印刷されていないことが分かりました。 – Coliwack

1

QDirの方法を使用できます。

QDir path("/home/istrab/iStrabGUI Output/"); 
path.cd(patientName); 
path.cd(techName); 
path.cd("/0/Frames"); 

QString pathString = path.path(); 
関連する問題