2014-10-30 3 views
-1

G'day!Использование calloc() и проверка отказа в C

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

int *A; 

A=(int *)malloc(NUM_ELEMENTS*sizeof(int)); 
if (!A) { 
    printf("mem failure, exiting \n"); 
    exit(EXIT_FAILURE); 
} 

Могу ли я сделать то же самое для calloc, даже если все присваивается 0? Я чувствую, что да, потому что мы будем проверять адрес mem в A, и не имеет значения, что A [0] равно 0, адрес mem не будет пустым, если только он не сработает.

ответ

2

Да, вы можете исправить ошибки calloc как malloc. Тем не менее, поскольку calloc является довольно устойчивым к ошибкам, вам обычно не нужно это делать, как описано здесь how can i know if calloc fails to initialize.

+0

@AggressiveSneeze. нет проблем! Удачи! – phantom

2

Да, ваше мышление верное. Вы можете сделать такую ​​же проверку с calloc по причинам, указанным вами.

2

Код OP также работает с malloc() как calloc().

Но ОП неверен, поскольку «mem-адрес не будет пустым, если он не сработал».

Если запрошенный размер размещения равен 0, возвращаемый указатель может be NULL.

«Если размер пространства запрошенный равен нулю, то поведение определяется реализацией: либо возвращается нулевой указатель, или поведение, как если бы размер был какой-то ненулевое значение, за исключением того, что возвращаемый указатель должен не должны использоваться для доступа к объекту ». C11dr §7.22.3.1 1

Более портативное решение:

A = calloc(NUM_ELEMENTS, sizeof *A); 
A = malloc(NUM_ELEMENTS * sizeof *A); 

// Add size check 
if (!A && NUM_ELEMENTS != 0) { 
    fputs("mem failure, exiting \n", stderr); 
    exit(EXIT_FAILURE); 
} 

Конечно, если NUM_ELEMENTS всегда> 0, то эта дополнительная проверка не требуется.

Смежные вопросы