Первая форма лучше в том смысле, что ваш код более безопасен; вы знаете, что ptr
будет либо содержать действительное значение адреса, либо NULL
перед его первым использованием.
Вторая форма оставляет вас открытыми для проблем, если вы случайно использовали ptr
, прежде чем назначать для нее действительный адрес; без явного инициализатора, его начальное значение равно неопределенным, и если вы случайно используете ptr
перед назначением ему, ваш код может или не может быть немедленно сбой.
Я могу в значительной степени гарантировать, что не будет заметной разницы в производительности во время выполнения или объеме памяти, а также не будет заметной разницы во времени сборки.
Вы должны всегда инициализировать переменные-указатели на время объявления и ИМО следует отложить их заявление пока вы на самом деле необходимость им.IOW, вместо того, чтобы писать что-то вроде этого:
void foo(void)
{
int *ptr = NULL;
/**
* several dozen lines of code
*/
ptr = malloc(sizeof *ptr * number_of_elements);
/**
* do stuff with ptr
*/
}
это лучше написать так:
void foo(void)
{
/**
* several dozen lines of code
*/
int *ptr = malloc(sizeof *ptr * number_of_elements);
/**
* do stuff with ptr
*/
}
Конечно, это возможно только с C99 на; если вы используете компилятор C89 или более ранний, все объявления должны перед любыми исполняемыми операциями в блоке.
Обычные нит:
Я бы использовал 'int * ptr = malloc (sizeof * ptr * size);' Интересно, учитывает ли '' size вашего '' sizeof (int) '. – chux
Пожалуйста, определите термин «лучше». –
Второй не инициализатор, а (начальное) назначение. – Olaf