Макрос с calloc, это безопасно? - PullRequest
1 голос
/ 05 апреля 2011

безопасно, если я использую этот макрос в своем коде?

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

Я использую gcc в качестве компилятора ...

В моей программе много точек выделения памятитак что я этим пользуюсь.Я попробовал это 5 минут назад, и у меня появился какой-то странный сигаборт и сигсев, теперь я иду домой ... после я попробую еще раз, если смогу что-то найти.

Какая-нибудь идея / совет?

РЕДАКТИРОВАНИЕ ДОБАВЛЕНО:

Обычно я использую макрос следующим образом:

double *x;
my_calloc(x, 10);

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

Ответы [ 2 ]

9 голосов
/ 05 апреля 2011

Я думаю, это должно быть:

#define my_calloc(x, n) do { (x) = calloc((n), sizeof *(x)); } while (0)
  • ненужный / опасный бросок был удален
  • лишние скобки удалены
  • do / while добавлено для корректного поведения между if (...) и else
  • фиксированный размер типа
  • удалить избыточные и непереносимые __typeof__
4 голосов
/ 05 апреля 2011

Ваш макрос выделяет n указатели не объекты. Попробуйте sizeof(*(x)).

...