Никто не коснулся аспекта исполнения, поэтому, наверное, мне придется. Если вам нужно написать очень быструю программу, то malloc со встроенным memset «на всякий случай» - не лучший способ. Не имеет значения, насколько быстро работает memset, он всегда будет слишком медленным. Иногда вы должны инициализировать вектор или массив, чтобы реальная проблема заключалась в контроле ваших тактов (я не теряю их). Однажды я услышал цитату «никогда не следует отказываться от производительности случайно», которая означает, что с точки зрения производительности вы всегда должны знать, почему вы решили реализовать код тем или иным образом (каковы плюсы и минусы и как их сравнивают) друг друга в конкретном случае).
Если у вас есть буфер, который будет заполнен строкой, было бы неплохо инициализировать его до того, как строка будет заполнена, но большинство согласится, что это полная потеря тактов. Если вы пишете новую функцию str *, вы, возможно, захотите - для целей отладки - заполнить буфер значением, которое обычно не должно появляться, но оно будет удалено во время распространения.
Как уже упоминали другие, компилятор предупредит, если происходит обращение к неинициализированной переменной, поэтому, как я понимаю, суть в том, что на самом деле нет оправдания для инициализации "на всякий случай".