掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.23635

malloc()関数などのメモリー管理域確保について
投稿者---あきき(2005/10/16 02:25:35)


いまさら何をと思われる方がほとんどと思いますが、例えば、malloc()関数は指定された大きさの記憶域を確保する機能を持つことはわかりますが、今まで

int a;
struct data st;
char b;
などと宣言すればメモリーは確保できたと思います。

なのに、malloc()関数などを用いてメモリーを確保する必要があるのか、それが分かりません。

例えば以下のプログラム

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int  n;
    void *pt;

    printf("input n: ");
    scanf("%d",&n);

    pt = malloc(sizeof(char) * (n+1));// 1
    if ( pt != NULL) {
        printf("input data :");
        scanf("%s",pt);// 1をしなくてもメモリーは確保されているのでは?
        printf("input data = %s\n",pt);
        free(pt);
    }
    else
        printf("can't malloc\n");

    return 0;
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:malloc()関数などのメモリー管理域確保について 23636 まきじ 2005/10/16 02:59:10
<子記事> Re:malloc()関数などのメモリー管理域確保について 23637 RAPT 2005/10/16 03:00:25


No.23636

Re:malloc()関数などのメモリー管理域確保について
投稿者---まきじ(2005/10/16 02:59:10)


>scanf("%s",pt);// 1をしなくてもメモリーは確保されているのでは?

void 型へのポインタを格納する領域は確保されています。

pt はどこを指してるか判らないので、char *pt と宣言し
scanf("%s",pt) などとすると実行時エラーとなります。


この投稿にコメントする

削除パスワード

No.23637

Re:malloc()関数などのメモリー管理域確保について
投稿者---RAPT(2005/10/16 03:00:25)


ポインタとメモリ管理について勉強しましょう。
端的にいえば、

char a;  // スタックにインスタンス確保
char *p; // スタックにポインタを確保
p = malloc(100); // ヒープにインスタンスを確保

--スタック領域--
[100]
[200]

--ヒープ領域--
[1000|1001|1002|...|1098|1099] などと確保され、

a はアドレス100を使用
p はアドレス200を使用
p にはそのヒープの位置 1000 が記憶される。

a = 'X';
アドレス100に'X'が記憶される
p[0] = 'Y';
アドレス1000に'Y'が記憶される

てなしくみです。


ポインタを使う理由の一つに、変数宣言時に配列の要素数を
動的に決められないからという制限回避があります。例えば、
char s[100];はOKですが、
int size=120;
char ss[size]; はコンパイルエラーです。




この投稿にコメントする

削除パスワード

No.23640

Re:malloc()関数などのメモリー管理域確保について
投稿者---あきき(2005/10/16 09:48:36)


私の質問に誤解を招く点がありました。

malloc()関数やcalloc()関数で一時的(期間は?)にメモリを確保したり、free()関数でメモリを開放するわけですよね。もちろん、メモリのどこをさしているのか判別するためにポインタを使用する必要があります。
 私が分からないのは、そのメモリを確保するのに、なぜ動的でなければならないのかと言う事です。そのメリットと関数の必然性が分からないのです。というのも

char str[100];
scanf("%s",str);

などの様に変数のメモリへの確保ができるのにと思いまして。どういう時に使用するのか、まだ分かりません。


この投稿にコメントする

削除パスワード

No.23643

Re:malloc()関数などのメモリー管理域確保について
投稿者---まきじ(2005/10/16 11:13:00)


>なぜ動的でなければならないのかと言う事です。そのメリットと関数の必然性が分からないのです。

配列などに格納するデータの件数が判らない時に力を発揮する。
char str[1000][256] とかやって 100 件程度しか格納しなければ
無駄にメモリを喰うし、データ件数はいくら頑張っても 1000 件しか
入らないです。もし 1001 件のデータを入れる事になればどうしますか?
コーディングし直しますか?
学校などの勉強では、それで問題ないと思います。


この投稿にコメントする

削除パスワード

No.23650

Re:malloc()関数などのメモリー管理域確保について
投稿者---あきき(2005/10/16 16:03:37)


>配列などに格納するデータの件数が判らない時に力を発揮する。
>char str[1000][256] とかやって 100 件程度しか格納しなければ
>無駄にメモリを喰うし、データ件数はいくら頑張っても 1000 件しか
>入らないです。もし 1001 件のデータを入れる事になればどうしますか?

配列を見落としていました。実務的に考えるとなくては困る関数だと言う事が理解できました。ありがとうございます。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧