Ads by Google

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
FC2ブックマーク | この記事をokyuuへインポート | このエントリーを含むはてなブックマーク | ニフティクリップへ追加 | この記事をクリップ! | イザ!ブックマーク | POOKMARK Airlinesに登録する | del.icio.us |
動作未検証 | | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証

[Development][Win32API]Windowsにおけるスタック変数(ローカル変数)とヒープ変数(グローバル変数)

 教養としてのC言語:ITpro ニュース [okyuu.com]のエントリーでネタにした話の続き。

 『by fujiyoshisyouta ( アクセス数:2571, 投稿数:226, マイクリップ数:74 ) |投稿時間:2008/10/06 10:11 』のコメントの検証用ソースコードを掲載してみたりします。

#include 
#include
#include
#include

void *area1=NULL;
void Sub_Routine();

int _tmain(int argc, _TCHAR* argv[])
{
Sub_Routine();

printf("%s\0",area2); // Sub_Routine()関数内でmalloc()したメモリは有効のまま

// main()関数を終了するまで、malloc()した領域は有効のまま
return 0;
// 関数が終了すると、自動的にプロセスのヒープ領域が解放される
}

void Sub_Routine()
{
const char sample_string[]="Sample.\0";
void *area2=NULL; // 子関数内でメモリ確保予定のポインタ

area2=(void*)malloc(10); // 子関数内でメモリ確保を実行
// malloc()関数は、内部的にHeapAlloc()というWindowsのAPIを使用している。
// HeapAlloc()は、ヒープ領域にメモリを確保するので、明示的な解放
// (WindowsのAPI的にはHeapFree())するまでは使用可能である。


strncat_s((char*)area2,sizeof(area2),sample_string,strlen(sample_string));

area1=area2; // 子関数内で確保したメモリをグローバル領域に転記

printf("%s\0",area2);

// 関数Sub_Routine()を終了すると、ローカルな自動変数area2は
// 破棄される。
// しかし、area2はポインタ変数なので、そのポインタが指す実体
// はそのまま残る。(メモリリーク)
}
  1. int _tmain(int argc, _TCHAR* argv[])
  2. void Sub_Routine()

 このソース内には、関数が二つあって、前者がエントリポイント、後者はエントリポイントから呼び出されるサブルーチン。

theme : プログラミング
genre : コンピュータ

FC2ブックマーク | この記事をokyuuへインポート | このエントリーを含むはてなブックマーク | ニフティクリップへ追加 | この記事をクリップ! | イザ!ブックマーク | POOKMARK Airlinesに登録する | del.icio.us |
動作未検証 | | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証

comment

管理者にだけメッセージを送る

カレンダー
10 | 2009/11 | 12
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 - - - - -
最近の記事
月別アーカイブ
カテゴリー
ブログ内検索
RSSフィード
リンク
いろいろリンクボタン
購入したものなど
埋め込みe-Words