стек вокруг переменной...был поврежден
У меня есть простая функция, которая записывает некоторые данные в новый файл. Он работает, и файл написан, но я получаю вышеупомянутую ошибку при отладке в 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, он все равно дает мне ошибку коррупции.
что пошло не так?
2 ответов
почему вы объявили буфер символов размером 20? Более чем вероятно sprintf
помещено больше символов, чем может поместиться в myChar.
вместо этого используйте
- безопасные конструкции, такие как std::ostringstream или
- по крайней мере, объявите, что массивы символов намного больше, чем вы ожидаете (не лучший способ, но, по крайней мере, не было бы ошибки).
Если вы идете вдоль " угадайте самый большой размер для мой массив" маршрут, последнее, что вы хотите сделать, это попытаться сосчитать, прямо вниз последнего символа, как большой, чтобы сделать буфер. Если вы отключены на один байт, это может привести к сбою.
предполагая 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-прекращение.