1

mallocで作成された動的メモリオブジェクトのサイズを大きくする関数を書いています。関数は、引数として、増加するメモリブロック、ブロックの現在のサイズ、およびブロックが増加する量へのポインタを取得する必要があります。

このようなもの:

int getMoreSpace(void **pnt, int size, int add) {
    xxxxxx *tmp; /* a pointer to the same as pnt */
    if (tmp = realloc(pnt, (size+add)*sizeof(xxxxxx))) { /* get size of what pnt points to */
        *pnt=tmp;
        return 1;
    else return 0;
}

問題は、pntが何を指していても関数を機能させたいということです。どうすればそれを達成できますか?

4

3 に答える 3

9

pntこのタイプの関数はローカルであり、関数が戻るとすぐに新しいポインタが失われるため、機能しない可能性があります。ポインタを更新できるように型の引数を取ることもできxxxxxx **ますが、その場合、単一の型のみをサポートすることに固執します。

本当の問題は、の不要で有害なラッパーを作成していることですrealloc。使用するつもりreallocだったので、直接使用してください。それをラップすることによってそれをより単純またはより効率的にする方法はありません。それはすでに可能な限り単純です。

于 2011-01-06T19:35:55.280 に答える
2

サイズを引数として渡します。便利なマクロを使用して、関数と同じように見せることができます。

#define getMoreSpace(P, SZ, ADD) getMoreSpaceFunc(&(P), sizeof(*(P)), (SZ), (ADD))

int getMoreSpace(void **pnt, size_t elem_size, int size, int add) {
    *pnt = ...
}

編集して、コンビニエンスマクロにも参照による呼び出しセマンティクスを追加する必要があることを示します。

于 2011-01-06T19:36:00.360 に答える
1

要素のサイズを個別のパラメータとして渡します。

int getMoreSpace(void **pnt, int size, int add, size_t eltSize) 
{     
  void *tmp;
  if (tmp = realloc(pnt, (size+add)*eltSize)) 
  { 
    *pnt=tmp;
    return 1;
  }
  else 
    return 0; 
} 
...

int *p = malloc(100 * sizeof *p);
...
if (!getMoreSpace(&p, 100, 20, sizeof *p))
{
  // panic
}

これは、最もエレガントではないにしても、最も簡単なソリューションです。Cは、動的な型情報には向いていません。

編集

pntスティーブのコメントに応じてタイプを変更しました。

cafが指摘しているように、これはSteveによる「修正」があっても機能しません。R.の権利; これをしないでください。

于 2011-01-06T20:31:18.157 に答える