#c #visual-studio-2008
#c #visual-studio-2008
Вопрос:
Следующий код выходит из строя во время выполнения, _strset_s
я указал 80 в качестве длины в _ strset_s
. В чем может быть проблема?. Я включил опцию проверки фрейма стека во время выполнения /RTCs
char strToken[80];
_strset_s(strToken, 80, '' );
Ответ №1:
Вы можете позволить компилятору выполнить заполнение, используя
char strToken[80] = {0};
Это приведет к обнулению всех байтов строки.
Комментарии:
1. Чисто из любопытства, почему вы рекомендуете,
= {0}
а не= {}
нет?2. @ildjarn — Оба одинаково допустимы, но не все компиляторы согласны с этим. Некоторые пытаются предупредить вас, что вы, возможно, забыли значения внутри { } .
3.
static char strToken[80];
также инициализируется с помощью 0
Ответ №2:
Ввод в _strset_s
должен завершаться нулем в соответствии с MSDN. Поскольку ваша строка ничем не инициализирована, это нарушает этот инвариант.
Если str является нулевым указателем, или аргумент size меньше или равен 0, или переданный блок не имеет нулевого завершения, то вызывается обработчик недопустимого параметра,
По умолчанию «обработчик недопустимых параметров» завершается сбоем, опять же из MSDN:
Недопустимый параметр по умолчанию вызывает отчет о сбое Watson, который вызывает сбой приложения и запрашивает пользователя, хочет ли он загрузить аварийный дамп в Microsoft для анализа.
Итак, я бы сначала попробовал завершить strToken нулем (или, еще лучше, сделать то, что предлагает Бо Перссон в своем ответе)
char strToken[80];
strToken[79] = '';
_strset_s(strToken, 80, '' );
Комментарии:
1. Код работал нормально в течение многих лет. Сбой произошел только тогда, когда я включил опцию проверки фрейма стека во время выполнения / RTCs. почему это происходит так?