プログラミングがよくわからん。今まで付け焼き刃でやってきたけど、もう限界。よし、基礎から勉強しよう。しかし元旦にやることじゃないよなー、ってもう2日か。しかし、思い立ったが吉日なのである!
目的
メモリ(仮想かもしれません)への書き込みをじかに見ることで、結局コードを実行するということは「メモリ(プログラム領域を含む)とCPUとのやりとり」なんだな、と1階層下の事象に落とし込む。
概要
mallocしたときのポインタの値を見て、Visual StudioのDebugメニューのMemory windowを表示して、その値をアドレスバーに入れると、直にそのメモリ位置のダンプが見えます。その状態でポインタを使うコードをステップ実行して、様子を見ます。
準備
ビルドおよび C++ コンソール アプリ プロジェクトの実行 | Microsoft Docs
書かれているとおりにすればできます。
方法
コーディングの準備をする
新規プロジェクトを作成します。
コンソールアプリを選びます。
コーディングする
プログラムの概要
- コンソール上で文字列を入力すると、入力した文字列が出力されます
- 内部では、あらかじめmallocでヒープに100バイトの領域を確保し、入力された文字列をそこへ入れ、出力し、最後に解放します。
ソースコード
#include "pch.h"
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <malloc.h> // _msize()を使うのに必要
int main()
{
char *str;
/* 文字列のためのメモリを確保 */
str = (char *)malloc(100);
if (str == NULL) {
printf("メモリが確保できません\n");
exit(1);
}
/* 文字列を入力 */
std::cin.getline(str, _msize(str));
//std::cin.getline(str, sizeof(str));
// こっちだと3文字しか表示されません
// ポインタのサイズ(この場合は4バイト=32ビット、つまり32ビット環境)
// を返してしまっているからです
// (最後の1バイトは終端文字に使われている)
/* 文字列の表示 */
puts(str);
/* メモリの解放 */
free(str);
return 0;
}
なぜsizeof()
では駄目なのか?は以下のページでわかりやすく説明されています。
せりか式 - C 言語チュートリアル - sizeof演算子
malloc_usable_size()
が使えない理由はこちらです。
[故]ぶろぐ: mallocで確保したサイズを後から取得する。
プログラムを実行する
ブレークポイントを置いて、ローカルでバッグ実行します。
ステップ実行する前に、メモリウィンドウを開きます。
ステップ実行します。
mallocでヒープメモリに確保された領域の先頭のアドレスが出てきました。そこを見てみましょう
左上にアドレスを入力すると、ちょうど100バイト、メモリが確保されています。
コンソールが起ち上がるので、好きな文字列を入れてEnterしましょう。
おお、入っています。
コンソールにも出力されました。
メモリが解放されました。
考察
Visual Studioってすごいんですね(疲れている)。