malloc はどんなときに?

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
ゲスト

malloc はどんなときに?

#1 投稿記事 by ゲスト »

初心者です。お願いします。

Dim a[99] As Long

Dim a As *Long
a = malloc(400)

は同じようにメモリを確保しているようですが、
後者の方が、free関数もあることを考えると行数も増えるし、
気を使いますよね。
あえて malloc が存在するには理由があると思います。
malloc の隠された威力を教えて頂けたらと思い投稿しました。
よろしくお願いします。
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

Re: malloc はどんなときに?

#2 投稿記事 by 7 »

> Dim a[99] As Long
> と
> Dim a As *Long
> a = malloc(400)
>
> は同じようにメモリを確保しているようですが、
> 後者の方が、free関数もあることを考えると行数も増えるし、
> 気を使いますよね。
> あえて malloc が存在するには理由があると思います。
> malloc の隠された威力を教えて頂けたらと思い投稿しました。
はい。隠された威力を教えてさしあげます。

コード: 全て選択

Dim b[256] As Byte
上のようなコードはメモリの静的確保と呼ばれています。たぶん。

コード: 全て選択

Dim b As BytePtr

b=malloc(256)
上のようなコードはメモリの動的確保と呼ばれています。たぶん...。

このように静的と動的の違いがあります。で、この違いが魅力でしょうか。

静的確保では以下のようなコードが通りません。

コード: 全て選択

Dim i=10 As Long
Dim b As Byte


しかし動的確保なら大丈夫です。

コード: 全て選択

Dim i=10 As Long
Dim b As BytePtr

b=malloc(i)


こういう説明だと分かり辛いかもしれませんが、
エディットボックスのような可変長データを取得することを考えると分かり易いでしょうか。
エディットボックスのデータ量は1KBなのに変数のサイズが256Bだったら入りませんよね?
しかし動的確保ならエディットボックスのデータ量だけ変数のサイズを決めることができます。

コード: 全て選択

Dim lpStr As LPSTR

	lpStr=malloc(GetWindowTextLength(hEdit)+1)


えーと、分かって頂けたでしょうか?
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#3 投稿記事 by イグトランス »

ほかにも,mallocでは大容量のメモリを用意できます。関数内の変数では,あまり沢山のメモリを使えません。下のプログラムは,おそらくコンパイルして実行するだけで強制終了させられます。

コード: 全て選択

Const SIZE = 4 * 1024 * 1024

Sub Proc()
	Dim t[ELM(SIZE)] As Byte
End Sub

Proc()
そういうときも,mallocの出番です。

コード: 全て選択

Sub Proc()
	Dim t As *Byte
	t = malloc(SIZE)
End Sub
ただ,実際のところ,大容量のメモリ確保にはVirtualAllocが薦められているんですけどね。
ゲスト

#4 投稿記事 by ゲスト »

7さん、イグトランスさん
非常に分かり易い解説でありがとうございました。

動的確保、大容量確保ができるということで、
早速、malloc を駆使してみます。
返信する