Согласно ответу Константина.
Вы уже выделили память для num с помощью инструкции malloc.
Если бы не было, вы могли бы сойти с рук:
char* num = "123456";
Который будет определять и распределять память на лету, но, скорее всего, он будет выделяться как константа и, следовательно, только для чтения.
Использование strncpy вместо strcpy для копирования «123456» гарантирует, что любой дополнительный пробел за пределами конца строки нулевым терминатором также будет инициализирован нулем, если вы укажете n как 100 (для вашего примера). В противном случае, не инициализируя память, выделенную malloc для нуля (memset (num, 0, 100)), тогда вполне возможно, что вы могли бы выйти за пределы конца строки.
О, почти забыл. Рекомендуется использовать strcpy_s или strncpy_s, так как они более безопасны, хотя для вашего кода это не имеет значения.