#c #указатели
Уважаемые профессионалы нужно ли инициализировать указатель значением NULL прежде чем добавить в него адрес какой то переменной?то есть так надо присваивать адрес ? int x = 80; int *num; num = &x; или так ? int x = 80; int *num = NULL; num = &x;
Ответы
Ответ 1
Инициализировать не обязательно, как и любую другую переменную. Если, конечно, при этом вы не используете неинициализированную переменную до того, как ей будет присвоено корректное значение. Но инициализация - это просто хороший тон, самоконтроль и способ избежать ошибок из-за использования до инициализации. Лучше ею не пренебрегать :) Хороший тон также после освобождения памяти занулить переменную-указатель - чтобы как минимум избежать случайного двойного освобождения.Ответ 2
Вопрос поставлен несколько бессмысленно - оба варианта плохи. Во-первых, во всех случаях надо стараться следовать правилу объявлять переменные настолько локально, насколько это возможно. Одним из главных преимуществ (если не главным преимуществом) такого подхода к объявлению переменных является возможность сразу инициализировать объявляемую переменную корректным значением, осмысленным с точки зрения реализуемого алгоритма. В вашем случае это будет int x = 80; int *num = &x; т.е. вопроса о какой-то "инициализации перед присваиванием" тут не должно быть и в помине. Без крайней необходимости никакого разделения на предварительную инициализацию и присваивание в коде возникать не должно вообще. Во-вторых, в тех же случаях, когда по тем или иным причинам в точке объявления переменной ей не удается сразу назначить осмысленный инициализатор, приходится действовать по обстоятельствам. Универсально верного абсолютно применимого правила не существует. Но сразу можно сказать, что огульное назначение всем переменным абстрактных "dummy" инициализаторов в ситуации, когда осмысленного инициализатора пока нет - грубейший и опаснейший антипаттерн, который, к сожалению, зачастую насаждают в форме хрестоматийного карго-культа в неокрепших умах студентов. Все, что происходит в случае такой инициализации - это замена неопределенного "мусорного" значения на какое-то определенное "мусорное" значение. Такая замена не дает ничего полезного, но может "замести под ковер" ошибки в коде, затруднить чтение кода, помешать оптимизациям и подавить встроенные средства санитизации отладочного кода, которыми обладают практически все современные компиляторы. Последние в многих случаях (в большинстве случаев) легко ловят и рапортуют доступ к неинициализированной переменной, но по понятным причинам не могут поймать доступ к переменной формально инициализированной неким "dummy" значением. Поэтому общая рекомендация тут такая: инициализация - это очень хорошо. Но это не должна быть инициализация чисто ради инициализации "чем попало". Старайтесь по возможности структурировать свои объявления так, чтобы каждое объявление переменной сразу же сопровождалось ее содержательной инициализацией, т.е. именно тем значением, которое вы собрались ей "присваивать" (в терминологии исходного вопроса). Если такая содержательная инициализация невозможна, то в большинстве случаев, возможно, лучше оставить переменную неинициализированной вообще, чем чисто ради проформы инициализировать ее каким-то "умолчательным" значением (типа нуля). Существует даже такая практика, когда в ситуации, когда готового инициализатора для объявляемой переменной нет, ее умышленно инициализируют нарочито "кривым" значением, типа, например, значения (void *) 0xBAADF00D для указателей. Такая "инициализация" повышает вероятность того, что обращение к фактически еще неинициализированной переменной вызовет мгновенное падение программы, т.е. будет обнаружено раньше, а не позже. Нулевой же указатель, в отличие от (void *) 0xBAADF00D, повышает вероятность того, что ошибка в программе будет долго жить незамеченной.Ответ 3
Если вы тут же присваиваете значение, то проще/лучше всего, как мне кажется, сделать так: int *num = &x; А по поводу того, можно или нет: C считает, что вы взрослый и понимаете то, что пишете. Язык не будет вам мешать сделать неправильно. Переменную можно не инициализировать, если вы гарантированно присвоите ей значение до первого чтения. Читать неинициализированную переменную нельзя, и ответственный за выполнение этого правила — вы, программист.
Комментариев нет:
Отправить комментарий