Стек вокруг переменной... был поврежден

У меня есть простая функция, которая записывает некоторые данные в новый файл. Он работает, и файл написан, но я получаю вышеупомянутую ошибку при отладке в MSVS Express 2013.

void writeSpecToFile(const char *fname); //in header file.

char myChar [20];
sprintf(myChar, "aa%03daa%daa", i1, i2);
const char* new_char = myChar;
writeSpecToFile(myChar);

Как видно, я просто вставляю некоторые переменные в строку, используя sprintf (отлично работает). Теперь, передаю ли я myChar или new_char, он все равно дает ошибку с ошибкой.

Что пошло не так?

Ответ 1

Почему вы объявили вам буфер символов размером 20? Скорее всего, sprintf помещает больше символов, чем это может поместиться в myChar.

Вместо этого используйте

  • более безопасные конструкции, такие как std:: ostringstream или
  • по крайней мере, объявите массив char намного большим, чем вы ожидали (не лучшим образом, но, по крайней мере, не возникла бы ошибка).

Если вы собираетесь "угадать самый большой размер для моего массива",   маршрут, последнее, что вы хотите сделать, это попытаться подсчитать, прямо вниз   до последнего символа, насколько велика возможность сделать буфер. Если вы отключены одним байтом, это может привести к сбою.

Ответ 2

Предполагая, что 32-бит int, печать с помощью %d приведет к отображению максимум 8 видимых символов.

Ваша форматированная строка также содержит 6 буквальных a -символов, и мы не должны забывать о 0-терминаторе.

Всего в целом: 2*8+6+1 = 23 > 20!!

Ваш буфер должен быть не менее 23 байтов, если нет других нераскрытых ограничений ввода.

Лично я бы дал ему раунд 32.

Кроме того, лучше использовать snprintf и, возможно, проверить полную строку сделал на самом деле подходит (если он не подходит вы получите сокращенную строку, так что никакой катастрофы).

char myChar [32];
snprintf(myChar, sizeof myChar, "aa%03daa%daa", i1, i2);

Берегитесь, что Microsoft реализация является несоответствующий и не гарантирует 0-терминатор.