私の仕事は、接尾辞配列を使って2つのtxtファイルで最も長い共通部分文字列を見つけることです。私は次のように行った:2つの接尾辞配列を作成しようとするとEXC_BAD_ACCESSエラーが発生するのはなぜですか?
#include <iostream>
#include <cstring>
#include <algorithm>
#include <fstream>
int main() {
char* charArrayA = charArrayFromTxtFile("~/txt_file1.txt");
char* charArrayB = charArrayFromTxtFile("~/txt_file2.txt");
int lengthA = strlen(charArrayA);
int lengthB = strlen(charArrayB);
char* suffixArrayA[lengthA];
char* suffixArrayB[lengthB];
for(int i = 0; i < lengthA; i++) { suffixArrayA[i] = &charArrayA[i]; }
for(int i = 0; i < lengthB; i++) { suffixArrayB[i] = &charArrayB[i]; }
charArrayA[lengthA] = 0;
charArrayB[lengthB] = 0;
...
return 0;
}
をしかし、私は、コードのこの部分をコンパイルしたとき、私はforループSECONDを含む行に次のエラーフラグを取得:
スレッド1:EXC_BAD_ACCESS(コード= 2、アドレス= 0x7ffeef1446e0)参考のため
、私はcharArrayAとcharArrayB作成するために使用する機能がある:それはケースFiのだろう、なぜ
char* charArrayFromTxtFile(std::string fileName) {
std::ifstream filename; // Variable for file
int length; // Number of characters
filename.open(fileName);
filename.seekg(0, std::ios::end); // Goes to the end of the file
length = filename.tellg(); // Location of the end (index, length of file)
filename.seekg(0, std::ios::beg); // Go back to the beginning
char* charArray = new char[length]; // Allocate a char array of "length" file
filename.read(charArray, length); // Write characters from txt file into the char array
filename.close();
return charArray;
}
誰もが知っています最初のtxtファイルは私に何のトラブルも与えませんが、2番目の問題はありますか?私はどんな指導にも感謝します。大変ありがとうございました!
P.S.これは私の最初のstackoverflowの質問ですので、うまくいけば私は十分に明確でした。問題のフォームでもフィードバックをいただければ幸いです! :D
サイズ「n」の配列の場合、アクセスできる最も高いインデックスは 'n-1'です。 'charArrayA [lengthA]'と 'charArrayB [lengthB]'の行は、配列の末尾を超えて未定義の動作である1つの要素に常にアクセスします。 –
'suffixArrayA [lengthA]'は可変長配列で、標準のC++ではありません。いくつかのコンパイラでは拡張機能としてサポートされていますが、移植可能な構造ではありません。特に、gccはデフォルトでそれをサポートしています。 –
'charArrayFromTxtFile'で既に' std :: string'を使用しているので、なぜあなたが動的配列を所有する生ポインタを返すのか分かりません。別の 'std :: string'を返すだけで、すべてをもっと簡単で安全にすることができます。 –