- 締切済み
C言語 ダブルポインタを引数にもつAPI
GetBuf ( char ** address, size_t *dataSize ); 第1引数: バッファの先頭アドレスをかえす 第2引数: バッファサイズをByte単位で返す 戻り値 1:成功 -1 取得失敗 typedef struct Test_t{ char* tempAddr; /* 先頭アドレスを格納 */ int bufSize; /* サイズを格納 */ } test_t 上記のAPIから情報を取得し、以下の構造体にデータを保持しようとしていますが GetBuffのダブルポインタの情報を構造体のメンバtempAddrに格納するにはどうしたらよいでしょうか このAPIのように引数でダブルポインタを使用するケースは一般的なのでしょうか? 教えていただけるとうれしいです。 よろしくお願い致します。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- opera-man
- ベストアンサー率26% (111/414)
>GetBuf(&x.tempAddr, (size_t*)&x.bufSize ); size_t*のキャストはポインタのため、スタックを壊すことはないですが、 型サイズがint<size_tでデータサイズ>intの場合は構造体が壊れます。。 GetBuf()関数は、エリアを動的に確保する関数かと思われますが、 このような用途の関数は必ずダブルポインタを使います。 それ以外に受け渡しようがないので(グローバル変数除く)
- Tacosan
- ベストアンサー率23% (3656/15482)
キャストすれば, 確かに「構造体に直接代入」できます. ただし「プログラムが正常に動作しない」可能性と引き換え, ですが. たとえば sizeof(int) = 4 sizeof(size_t) = 8 という環境で, 正常に動作すると思いますか?
- wormhole
- ベストアンサー率28% (1626/5665)
>GetBuf(&x.tempAddr, (size_t*)&x.bufSize ); 第2引数はダメです。 intとsize_tは違いますよ。
- Tacosan
- ベストアンサー率23% (3656/15482)
typedef struct Test_t{ char* tempAddr; /* 先頭アドレスを格納 */ int bufSize; /* サイズを格納 */ } test_t; と GetBuf ( char ** address, size_t *dataSize ); に対して GetBuf(&x.tempAddr, (size_t*)&x.bufSize ); はダメです.
- notnot
- ベストアンサー率47% (4900/10361)
>このAPIのように引数でダブルポインタを使用するケースは一般的なのでしょうか? ダブルポインタなどと言うおかしな言葉を使わないで考えた方が良いでしょう。 「引数で値を返したいときは、引数では、"返したい値の型のポインタ"を使う」 というのは考えるまでもなく明らかなことですね。 従って、返したい型がポインタなら、引数はポインタのポインタになるのも同じく当然です。 >引数に構造体を直接指定する場合は、以下のようにしても問題ないでしょうか? 問題ありません。
- salsberry
- ベストアンサー率69% (495/711)
char *address; size_t dataSize; test_t x; int ret; ret = GetBuf(&address, &dataSize); if (ret == 1) { x.tempAddr = address; } else { /* 略 */ } > このAPIのように引数でダブルポインタを使用するケースは一般的なのでしょうか? 珍しいことではないと思います。
お礼
回答ありがとうございました。 引数に構造体を直接指定する場合は、以下のようにしても 問題ないでしょうか? test_t x; GetBuf(&x.tempAddr, (size_t*)&x.bufSize );
お礼
回答ありがとうございます。 Castすれば構造体に直接代入できると思っていました。。。 No1の回答者のように、 一度、同じ型の変数に代入するしか方法はないのでしょうか? char *address; size_t dataSize; test_t x; int ret; ret = GetBuf(&address, &dataSize); if (ret == 1) { x.tempAddr = address; } else { /* 略 */ }