C言語関係掲示板

過去ログ

No.53. メモリ領域確保について


main()から自作関数read()にchar型のポインタ変数を渡し、そのポインタ
変数をmallocし、その変数をmain()に戻したいのですが、これはポインタ
のポインタを使用しなければ、いけないのでしょうか?

確保した際に、free()というのはmain()の中でもよろしいのでしょうか?

よろしくお願いします。


kuronekoさん、こんにちは。

>main()から自作関数read()にchar型のポインタ変数を渡し、そのポインタ
>変数をmallocし、その変数をmain()に戻したいのですが、これはポインタ
>のポインタを使用しなければ、いけないのでしょうか?
>
>確保した際に、free()というのはmain()の中でもよろしいのでしょうか?

上記をプログラムに直すと、次のようになり、ポインタのポインタを使用する
ようになります。free()はmain()の中でかまいません。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void mread(char **q,size_t size);

int main(void)
{
        char    *p;

        mread(&p,10);

        puts(p);

        free(p);

        return(0);
}

void mread(char **q,size_t size)
{
        if ((*q = (char *)malloc(size)) == NULL) {
                fprintf(stderr,"malloc error!!\n");
                exit(1);
        }
        strcpy(*q,"ABCDEF");
}


ですが、こちらの方がスッキリするかもしれません。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *mread(size_t size);

int main(void)
{
    char    *p;

        p = mread(10);

        puts(p);

        free(p);

        return(0);
}

char *mread(size_t size)
{
        char *q;

        if ((q = (char *)malloc(size)) == NULL) {
                fprintf(stderr,"malloc error!!\n");
                exit(1);
        }
        strcpy(q,"ABCDEF");
        return(q);
}


なお、readという低水準ファイルIOの関数が存在しますので、関数名はmread
にしました。


ともじさん、本当にありがとうございます。

ともじさんのプログラムを参考にさせて頂きます。

ありがとうございました。

戻る


「初心者のためのポイント学習C言語」 Last modified:2001.10.7
Copyright(c) 2000-2002 TOMOJI All Rights Reserved