- ベストアンサー
メモリ関連のエラーを取り除くには・・
下記プログラムで、「.」区切りの文字列を 区切って返すプログラムを作成していますが、 メモリ関連のエラーが出てしまいます。 このようなメモリのエラーを取り除くには、何か 有用なツールでも使用すると楽になるのでしょうか。 自分で追いかけるのは大変なので・・ ちなみにmainの中で関数に渡したResultに結果が 入ってくるはずなのですが、mainの中で参照しようと するとエラーになってしまったので、bunkatu関数のなかで 表示するように一時的に変えております。 また、メモリの動的確保を行う場合には、同一のブロックで 行う必要があるのでしょうか。 #include <cstdlib> #include <iostream> using namespace std; int bunkatu (char *pOrg, int *iNum, char **Result); void main () { int iNum; char **Result = NULL; //結果格納用 bunkatu ("aaaa.fasdfafda.fa.dddd", &iNum, Result); } int bunkatu (char *pOrg, int *iNum, char **Result) { int iRtn; int iLocate = 0; int iTarget[10]; int iCount = 0; char *pTmp; pTmp = pOrg; if (*pTmp == '\0') { //空文字列の場合 iRtn = 1; } else { //空文字列以外の場合 //.を探す while (*pTmp != '\0') { //文字列終わりまで繰り返す。 if (*pTmp == '.') { //.が見つかった場合 iTarget[iCount] = iLocate; //.が見つかった添え字を保存 iCount++; //次の保存用にカウンタをカウントアップ } iLocate++; //詮索先を示すものをカウントアップ pTmp++; //詮索する位置を移動 } Result = (char **) calloc (iCount+1, sizeof (char *)); //切り出して表示 int iStart, iEnd; for (int j = 0; j < iCount+ 1; j++) { if (j == 0) { //はじめ iStart = 0; iEnd = iTarget[j] - 1; } else if(j < iCount){ //中間 iStart = iTarget[j - 1] + 1; iEnd = iTarget[j] - 1; } else if (j == iCount) { //最後 iStart = iTarget[j - 1] + 1; iEnd = strlen (pOrg) -1; } Result[j] = (char *) calloc (iEnd - iStart + 2, sizeof (char)); for (int k = 0; k < iEnd - iStart + 1; k++) { Result[j][k] = pOrg[iStart + k]; } Result[j][iEnd - iStart + 1] = '\0'; } *iNum = iCount; iRtn = 0; } //ちなみに~の部分 for (int i = 0; i < *iNum + 1 ; i++) { cout << Result[i] << endl; } for (int i = 0; i < *iNum + 1 ; i++) { free (Result[i]); } free (Result); return iRtn; }
補足
色々と実験してみて、エラーもなく実行できるように なりました。 問題部分はユーザ定義関数にダブルポインタを参照渡しして いなかったことだと思われます。 > 当然です。 > 文字列リテラル(文字列定数)に \0 を書き込んでいます。 の部分が理解できませんでした。 このままでも最終版のソースではエラー出ませんでした。 >この程度のソースでは自分でバグを目で追いかけて探した方が早い気がしますけど。 > ツールを使う前にソースデバッグ(ソースを見てデバッグ)を行って下さい。 大規模になったときにはどのようなツールを使うのでしょうか。