dポイントプレゼントキャンペーン実施中!

下位関数へポインタのアドレスを渡して(器を渡して)
内容を設定してもらうというのは、よくやることと
おもいます。

そのポインタの領域は、普通は上位関数で実体を確保する
と思っていたのですが、下位関数での実体確保することは
可能なのでしょうか?

対象はc言語です。

宜しく御願い致します。

A 回答 (6件)

> 下位関数の戻り値を上位関数が取得するのではなく


> 下位関数へ引数で渡した場合は、実現できるのでしょうか?

できます。*が一個増えますが。

void sub(int** aaa) {
*aaa = malloc(...);
...
}

int* aaa;
sub(&aaa);
...
free(aaa); /* 必須 */
    • good
    • 0
この回答へのお礼

再度の御回答ありがとうございました。

御手数をおかけしました。
大変助かりました。

お礼日時:2005/08/24 21:35

こういう手はありですよね。



#include <stdio.h>
#include <malloc.h>

typedef struct{
 char a;
 int b;
} Fuga;

Fuga* Fuga_new(void)
{
 Fuga *this;

 this = (Fuga *)malloc( sizeof(Fuga) );

 this->a = 1;
 this->b = 2;

 return this;
}

void Fuga_print(Fuga *this)
{
 printf("a = %d, b = %d \n", this->a, this->b );
}

void Fuga_delete(Fuga *this)
{
 free(this);
}

void main(void){

 Fuga *fuga;

 fuga = Fuga_new();
 Fuga_print( fuga );
 Fuga_delete( fuga );
}

動作確認済みです。

(参考)
http://www.sage-p.com/process/cool.htm
    • good
    • 0
この回答へのお礼

御回答ありがとうございます。

参考URLまで、助かりました。

お礼日時:2005/08/24 21:33

上位関数で実体を一切確保せずにポインタを下位関数に渡し、下位関数で実体を確保することは不可能です。



上位関数で「ポインタを受け取るためのポインタ」を用意し、それを下位関数に渡すことは可能です。その場合、上位関数では「ポインタを受け取るための場所」という実体をまず確保し、そのポインタを下位関数に渡すことになります。
    • good
    • 0
この回答へのお礼

御回答ありがとうございます。

お礼日時:2005/08/24 21:33

int* do_something() {


int* result = malloc(sizeof(int)*N);
....
return result;
}

ただし、受け取った結果は速やかに free すべし。

この回答への補足

すみません

記述されているのは、下位関数ですよね?
下位関数の戻り値を上位関数が取得するのではなく
下位関数へ引数で渡した場合は、実現できるのでしょうか?

下記のコーディングのように実施した場合
sub()コール後にaaaの参照は可能でしょうか?

int
main()
{
int* aaa = NULL;

sub(aaa);
return 0;
}

int
sub(int *aaa)
{
aaa = malloc();
}

補足日時:2005/08/24 11:38
    • good
    • 0

可能です。


ただ、その実体が不要になったときの開放を考慮していないとメモリリークになる可能性もあります。
    • good
    • 0
この回答へのお礼

御回答ありがとうございます。

お礼日時:2005/08/24 21:35

下位関数で確保しても、その関数を終了したら開放されてしまいますね。



スタック変数の領域は上位関数の変数から積み上げられるように確保されていくので、そのようなことは無理だと思います。

どうしてもそのようなことをしたいのであればヒープ領域を使う以外ない (malloc, calloc) と思います。

専門家ではないので、間違っていたらごめんなさい。
    • good
    • 0
この回答へのお礼

御回答ありがとうございます。
確かにスタックのみでは無理ですね。。。

お礼日時:2005/08/24 21:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!