
Cのプログラムを作成しているのですが、どうしても分からないので質問させてください。
以下のように、日本語を含んだテキストファイルから一行読み込み、その行の中のある部分だけ切り取るという関数を作ったのですが、メモリを解放する段階(free関数の部分)で動作が止まってしまいます。
どうすれば良のでしょうか?
使用環境は、windows vista, visual C++ Express Editionです。
よろしくお願いします。
char mid(wchar_t *str, int st, int ed, char result[128])
{
wchar_t *ans = (wchar_t*)malloc(sizeof(wchar_t));
wcscpy(ans,&str[st]);
ans[ed-st+1] = L'\0';
wcstombs(result, ans, 128);
printf("result = %s \n",result);
free(ans);
ans = NULL;
return 0;
}
*str:日本語を含んだ文字列(1行分)
st:切り取りを始端
ed:切り取りの終端
ans:切り取り結果
result:切り取り結果(マルチワイド文字列)
また、何故かワイド文字列で定義した「ans」のままではうまくいかず、マルチワイド文字列「result」だとうまくいきませんでした。
これの理由も、できればお願いいたします。
No.2ベストアンサー
- 回答日時:
や, malloc で確保する量を間違っているのではないかと思われます>#1.
ちゃんと「必要な分」だけ確保していますか?
ちなみに最後から 2行前の文は意味不明.
この回答への補足
回答ありがとうございます。
確保する量をwcscpyでコピーする文字数分にして、再度実行してみましたが、やはり動作が止まってしまいました。
wcstombs(result, ans, 128);
printf("result = %s \n",result);
の表示はされているので、そこまでは問題無いかと思っていたのですが・・・。
「必要な分」=「コピーする文字数分」で良いのでしょうか?
No.8
- 回答日時:
それだけでは「十分に確保している」かどうかはわかりません. malloc している行をどのように修正したのか見せてください.
あと
何故かワイド文字列で定義した「ans」のままではうまくいかず、マルチワイド文字列「result」だとうまくいきませんでした。
って書いてるけど, 「うまくいった」かどうかはあなたにしか分かりません. なので, これだけでは「理由」を判断しようがありません.
・あなたが期待した結果
・実際に得られた結果
を書いてください.
この回答への補足
回答ありがとうございます。
mallocの部分を以下のように修正しました。
「ans」に読み込む文字列よりも十分に大きいメモリを確保するようにwchar_t型×128文字分確保しました。実際に「ans」に読み込むのは8文字分です。
どうでしょうか?
ちなみに関数の下の方で、printf関数を使っている部分は「ans」と「result」の内容が正しく表示されています。
char mid(wchar_t *str, int st, int ed, char result[128])
{
wchar_t *ans;
ans= (wchar_t*)malloc(sizeof(wchar_t)*128);
if(ans == NULL) printf("con't locate ans \n");
else printf("locate ans O.K. \n");
wcscpy(ans,&str[st]);
ans[ed-st+1] = L'\0';
printf("ans = %ls \n",ans);
wcstombs(result, ans, 128);
printf("result = %s \n",result);
free (ans);
return 0;
}
また、「ans」と「result」の問題は関数から返すときのミスで、修正できました。ありがとうございました。
No.7
- 回答日時:
質問に対する直接の回答は既に出てるので割愛。
> また、何故かワイド文字列で定義した「ans」のままではうまくいかず、マルチワイド文字列「result」だとうまくいきませんでした。
「ワイド文字列のansではNG、マルチ『バイト』文字列のresultではOK」という意味なら、ワイドかマルチバイトかの差ではなくresultは一定の領域を確保済みだからです。
128バイトを超えれば同じようにエラー停止します。
No.5
- 回答日時:
#2さんの回答どおりかと。
>wchar_t *ans = (wchar_t*)malloc(sizeof(wchar_t));
wchar_t型1つ分のメモリしか確保していません。
よって、ワイド型の「文字」しか格納できる分しかありません。
が、
>wcscpy(ans,&str[st]);
「文字列」を入れました。
&str[st]にあるのがが終端コードで無い限り、2文字分以上は書き込まれています。
ということで、Cランタイムが管理しているメモリブロックの管理領域などを破壊したのでしょう。
free()でその破壊された管理領域を参照して次の管理領域をたどって……
あれれれ?
ということかと。
No.4
- 回答日時:
そもそも、
>メモリを解放する段階(free関数の部分)で動作が止まってしまいます。
このことをどうやって確認されましたか?>質問者さん
この回答への補足
回答ありがとうございます。
直前の
wcstombs(result, ans, 128);
printf("result = %s \n",result);
という部分まで表示されて動作が止まることから、そこまでは問題無いかと考えたのですが・・・。
皆さんの言われるように、メモリを確保してみたのですが、うまくいかず悩んでいます。何か他に原因など考えられるでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
callocの処理速度
-
128ビット変数の符合表現について
-
VB6からVCで作成したDLLへのvoi...
-
ヒープ領域の限界値設定
-
x64環境で連続4GB以上のメモリ...
-
reallocについて
-
仮想領域にウインドウを描画
-
C++で、メンバもヒープに確保さ...
-
GDI+におけるメモリの開放について
-
C++とC#って何が違うのですか?
-
C++ 構造体のnew
-
HEAP に関すること
-
DLLで同じメモリ領域を参照する...
-
入れ子になった構造体について
-
malloc メモリリークについて
-
C言語 配列の長さの上限
-
WSH(VBS)でJSONの文字列を読み...
-
C++ メンバイニシャライザリス...
-
プログラミング言語の変数と数...
-
コンストラクタ内での動的メモ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
allocってなんですか?
-
C++のnewで確保したメモリーの...
-
newしないオブジェクトについて
-
c言語のポインタへの文字列入力...
-
プログラムが途中で強制終了し...
-
Win32APIでのメモリ管理について
-
グローバル変数のサイズ
-
ヒープメモリの解放について
-
stringの最大サイズ
-
Accessで、メモリを開放するタ...
-
入れ子になった構造体について
-
void*型のデータサイズ
-
DLLで同じメモリ領域を参照する...
-
callocの処理速度
-
mallocで確保するメモリの領域...
-
ビットをローテートするプログ...
-
DLLのマルチスレッドの動作につ...
-
C++で、メンバもヒープに確保さ...
-
LoadLibraryでAccess Violation...
-
配列の添え字の最大数とは?
おすすめ情報