みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

コンパイルして実行すると
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);
}
どなたか解決方法を知っている方、回答よろしくお願いします。

投稿日時 - 2006-03-20 17:53:53

QNo.2040934

BPG

困ってます

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

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);
}

投稿日時 - 2006-03-20 20:42:12

お礼

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

投稿日時 - 2006-03-20 23:10:23

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

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

投稿日時 - 2006-03-20 18:58:55

補足

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

投稿日時 - 2006-03-20 19:54:29

あなたにオススメの質問