Удобнее использовать функцию макроса, например:
#include <stdio.h>
#include <stdlib.h>
#define NEW_ARRAY(ptr, n) \
{ \
(ptr) = malloc((size_t) (n) * sizeof (ptr)[0]); \
if ((ptr) == NULL) { \
fputs("Can't allocate memory\n", stderr); \
exit(EXIT_FAILURE); \
} \
}
#define NEW(ptr) NEW_ARRAY((ptr), 1)
int main(void)
{
int *myArray;
const int myArrayLen = 100;
int i;
NEW_ARRAY(myArray, myArrayLen);
for (i = 0; i < myArrayLen; i++) {
/*...*/
}
return 0;
}
Обновление:
Цель макроса - абстрагировать детали и сделать выделение памяти менее подверженным ошибкам , С (не макро) функцией мы должны были бы передать размер элемента в качестве параметра, поскольку эта информация теряется, когда указатель передается формальному параметру типа void pointer:
void NewArray(void *ptr, int n, int elemSize)
{
*ptr = malloc((size_t) n * sizeof elemSize);
if (*ptr == NULL) {
fputs("Can't allocate memory\n", stderr);
exit(EXIT_FAILURE);
}
}
С функцией NewArray вызов выделения, соответствующий первому примеру, становится
NewArray(&myArray, n, sizeof myArray[0]);
, что нас мало покупает.