• ベストアンサー

メモリ違反でソフトが強制終了してしまいます。

コンパイルして実行すると ttp://kei100.jp/diary/images/20050612_0.png このようなメッセージが表示されてしまいます。 #include <windows.h> #include <stdio.h> #include <string.h> void main(void) { HANDLE hFile; HGLOBAL hg = GlobalAlloc(GMEM_FIXED, 1000); char* test = "test"; LPTSTR aaa="spacetestspace"; char* bbb = NULL; char ccc[5]; aaa=(char*)GlobalLock(hg); bbb = strstr(aaa, test); strncpy(ccc, bbb, strlen(test)); printf("ccc = %s \n", ccc); GlobalUnlock(hg); GlobalFree(hg); GlobalFree(aaa); } どなたか解決方法を知っている方、回答よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

LPTSTR aaa="spacetestspace"; しているのに aaa=(char*)GlobalLock(hg); これだとaaaが"spacetestspace"へのポインタではなくなります。 次にGlobalFree(aaa); ::GlobalFreeの引数はHGLOBALです。 よってGlobalFree(aaa);は不要 strncpy(ccc, bbb, strlen(test)); これだとcccの最後に終端文字が入りません。 ccc[4] = '\0';を追加 #include <windows.h> #include <stdio.h> #include <string.h> void main(void) { HANDLE hFile; HGLOBAL hg = GlobalAlloc(GMEM_FIXED, 1000); char* test = "test"; LPTSTR aaa; char* bbb = NULL; char ccc[5]; aaa=(char*)GlobalLock(hg); strcpy( aaa , "spacetestspace" ); bbb = strstr(aaa, test); strncpy(ccc, bbb, strlen(test)); ccc[4] = '\0'; printf("ccc = %s \n", ccc); GlobalUnlock(hg); GlobalFree(hg); }

BPG
質問者

お礼

なるほど非常に参考になります。 助かりました。 また機会があれば回答のほどよろしくお願いします。 本当にありがとうございました。

その他の回答 (1)

noname#16581
noname#16581
回答No.1

GlobalLockしてから、strcpyすればいいと思います。 後、strncpy(ccc, bbb, strlen(test));は、'\0'文字足りません。 char ccc[5]={'\0'};と宣言するといいと思います。

BPG
質問者

補足

>後、strncpy(ccc, bbb, strlen(test));は、'\0'文字足りません。 >char ccc[5]={'\0'};と宣言するといいと思います。 \0文字足りないことも困っていたので助かりました。 ありがとうございます。 しかし、GlobalLockしてから、strcpyをしてみたのですが同じエラーメッセージが表示されてしまいました。

関連するQ&A