char *test[8]
- это массив из 8 char *
, или указатели на строки, и, поскольку вы не укажете, они все установлены в мусорные значения.Таким образом, sprintf
пытается записать данные в who-знает-где.
Вместо этого следует использовать char test[8]
, который выделяет массив из 8 char
, а затем sprintf(test, "%d", num);
.
ОБНОВЛЕНИЕ: Если вы хотите использовать char *
указатели, вы должны выделить место:
char *test = malloc(8 /* see note below */);
sprintf(test, "%d", num);
Если вы хотите использовать массив char *
указателей, он работает так же:
char *test[8]; // 8 pointers to strings
test[0] = malloc(8); // allocate memory for the first pointer
sprintf(test[0], "%d", num);
Имейте в виду, что вам придется вызывать malloc
для каждого из test[0]
- test[7]
в отдельности.
Кроме того, как указано в комментариях, если ваш компилятор поддерживает его, вы должны использоватьsnprintf()
.Это как sprintf
, но он принимает дополнительный параметр размером с буфер:
snprintf(test, 8, "%d", num);
и гарантирует, что не будет использовать больше места, чем вы позволите.Это безопаснее, и, если вам нужно, snprintf
возвращает количество места, которое он фактически хотел, поэтому, если вы предоставили ему слишком мало места, вы можете realloc
и попробовать еще раз.
Примечание: некоторые скажут этодолжно быть malloc(8 * sizeof(char))
(или sizeof *test
).Они не правы (по моему объективно правильному мнению; обратите внимание на сарказм)!sizeof(char)
гарантированно равно 1, поэтому это умножение не является необходимым.
Некоторые рекомендуют использовать TYPE *p = malloc(x * sizeof *p)
, так что если TYPE изменится, вам нужно будет изменить его только в одном месте, и sizeof *p
адаптируется.Я один из этих людей, но, по моему мнению, вам редко понадобится обновить char *
до другого типа.Так как многие функции используют char *
и их нужно будет изменить при таком обновлении, я не беспокоюсь о том, чтобы сделать malloc
строки более гибкими.