C言語関係掲示板

過去ログ

No.948 callocで領域を確保する自作関数を作成

[戻る] [ホームページ]
No.12057

calloc関数について
投稿者---シスコ(2004/01/23 00:15:35)



こんばんわ。

calloc関数の確保する領域の有効範囲を教えてください。

目的は、領域を確保する自作関数を作成したいです。


また、プログラムが終了すれば、自動的に開放されるのでしょうか?

よろしくお願いします。


No.12058

Re:calloc関数について
投稿者---nop(2004/01/23 00:23:37)


>calloc関数の確保する領域の有効範囲を教えてください。

何の有効範囲ですか?

>また、プログラムが終了すれば、自動的に開放されるのでしょうか?

基本的には解放されるはずだったと思うが、
個人的には自分で確保した領域は自分で解放するのが礼儀かと。

No.12092

Re:calloc関数について
投稿者---シスコ(2004/01/23 23:50:53)


nopさんこんばんわ。

説明が不足していたようです。

例えば、領域を確保してくれる関数を作成
したいのです。

void kakuho(int *x)
{
    x = (int *)calloc(1, sizeof(int));
}


この場合、関数内で確保した領域は、関数をでた
あとで、有効でないようで、mainでエラーになります。
変数でいうところの、staticでは、ないようなのです。

よろしくお願いします。


No.12093

Re:calloc関数について
投稿者---おでん(2004/01/23 23:57:14)


>nopさんこんばんわ。
>
>説明が不足していたようです。
>
>例えば、領域を確保してくれる関数を作成
>したいのです。
>
>
void kakuho(int *x)
{
    x = (int *)calloc(1, sizeof(int));
}

>
>この場合、関数内で確保した領域は、関数をでた
>あとで、有効でないようで、mainでエラーになります。
>変数でいうところの、staticでは、ないようなのです。
>

何を持って、“関数をでたあとで、有効でない”と思ったのでしょう?
呼び出し元で、ちゃんとポインタのアドレス渡してますか?

No.12095

Re:calloc関数について
投稿者---シスコ(2004/01/24 00:07:26)


おでんさん。こんばんわ。

念のため、main関数も記載します。

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

void kakuho(int *x)
{
    x = (int *)calloc(1, sizeof(int));
}

int main(void)
{
    int *p;
    
    kakuho(p);
    *p = 200;
    printf("%d\n", *p);
    free(p);
    return(0);
}



BCCが出す警告は、
「パラメータ 'x' は一度も使用されない(関数 kakuho )」
「'x' に代入した値は使われていない(関数 kakuho )」

で、Windows xp?が出すエラーは、
「問題が発生したため、終了します」
と出ます。


よろしくお願いします。


No.12099

Re:calloc関数について
投稿者---おでん(2004/01/24 00:24:35)


思った通りと言うか・・・

kakuho(p); ←これではダメです。
kakuho(&p); ←ポインタのアドレスを渡す。

Cの関数パラメータは、値渡しなので、呼び出し元で関数が
設定した値が欲しい時はアドレスを渡さなければなりません。

No.12100

Re:calloc関数について
投稿者---シスコ(2004/01/24 00:38:46)


おでんさん。

ありがとうございます。

エラー無しに、できました。

しかし、正直言って、頭の中は
混乱しています。

少し、自分で整理してみます。

また、質問させていただくかもしれませんので、
そのときは、よろしくお願いします。


No.12145

Re:calloc関数について
投稿者---nop(2004/01/26 13:03:46)


>例えば、領域を確保してくれる関数を作成
>したいのです。
>
>void kakuho(int *x)
>{
>    x = (int *)calloc(1, sizeof(int));
>}
>この場合、関数内で確保した領域は、関数をでた
>あとで、有効でないようで、mainでエラーになります。
>変数でいうところの、staticでは、ないようなのです。


calloc() で確保された領域は有効ですが、
確保した領域を示すポインタを呼び出し側に返していません。
void kakuho(int **x)
{
    *x = (int *)calloc(1, sizeof(int));
}
int main( void )
{
    int *x;
    kakuho( &x );
    return 0;
}

または
int *kakuho( void )
{
    int *x;
    x = (int *)calloc(1, sizeof(int));
    return x;
}
int main( void )
{
    int *x;
    x = kakuho();
    return 0;
}

の様な形式にし、呼び出し側へポインタ値を返して下さい。