1

コードでこのマクロを使用しても安全ですか?

#define my_calloc(x, n) ((x) = (__typeof__ (x))calloc((n), sizeof(__typeof__ (&(x)))))

私はコンパイラとしてgccを使用しています...

私のプログラムにはたくさんのメモリ割り当てポイントがあるので、これを使用します。5分前に試してみましたが、奇妙なsigabortとsigsevが表示されました。今、家に帰ります...何かが見つかったらもう一度試してみます。

いくつかのアイデア/ヒント?

追加された編集:

通常、私は次のようにマクロを使用します。

double *x;
my_calloc(x, 10);

int **y;
my_calloc(y, 30);
4

2 に答える 2

9

おそらくそうあるべきだと思います:

#define my_calloc(x, n) do { (x) = calloc((n), sizeof *(x)); } while (0)
  • 不要/危険なキャストは削除されました
  • 余分な括弧を削除
  • if (...)との間の正しい動作のために do/while を追加else
  • タイプの固定サイズ
  • 冗長で移植性のないものを削除する__typeof__
于 2011-04-05T19:59:36.663 に答える
4

マクロは、オブジェクトではなくn ポインターを割り当てます。試してみてくださいsizeof(*(x))

于 2011-04-05T19:57:12.310 に答える