1。我编写了以下代码,该代码在运行时编译但崩溃,显示“访问违规写入”,同时调用 _tcsset 。
void function(TCHAR *tsatz)
{
printf( "Before: %s\n", tsatz );
_tcsset(tsatz,'*');
printf( "After: %s\n", tsatz );
}
void main( void )
{
TCHAR* tsatz;
tsatz = new char[256];
tsatz = "This is a test string ";
function(tsatz);
getchar();
}
使用_tcsset时我错在哪里?
2. 我知道如果我们告诉他们目标缓冲区有多大,所有“安全”函数都能正常工作。但是如果我需要在“函数”中使用_tcsset_s,其中tsatz来自外部,是否有办法?
我是初学者。我能得到的任何帮助都非常感谢。提前谢谢。
答案 0 :(得分:2)
您正在修改字符串文字,这是未定义的行为。
tsatz = "This is a test string ";
这不会将字符串文字复制到tsatz
,它只是指定tsatz
指向"This is a test string ";
的地址,无法修改。
解决此问题的一种方法是将tsatz
声明为数组,并使用字符串文字对其进行初始化,这将自动将文本复制到数组中
TCHAR tsatz[] = "This is a test string ";
如果你需要跟踪一个数组的大小,你需要明确地这样做(注意sizeof
只有当操作数实际上是一个数组而不是一个指针时,数组才会起作用) :
void function(TCHAR *tsatz, size_t numberOfElements)
{
_tprintf( "Before: %s\n", tsatz );
_tcsset_s(tsatz, numberOfElements, '*');
_tprintf( "After: %s\n", tsatz );
}
void main( void )
{
TCHAR tsatz[] = "This is a test string ";
function(tsatz, sizeof tsatz / sizeof(TCHAR));
getchar();
}
或使用模板
template<size_t sz>
void function(TCHAR (tsatz&)[sz])
{
_tprintf( "Before: %s\n", tsatz );
_tcsset_s(tsatz, sizeof tsatz / sizeof(TCHAR), '*');
_tprintf( "After: %s\n", tsatz );
}
或者您可以改为使用std::basic_string
。
答案 1 :(得分:0)
您的代码的问题是您将只读C字符串分配给指针变量TCHAR* tsatz;
;因此访问违规。
可能的解决方案:
TCHAR tsatz[256] = "This is a test string ";
function(tsatz);
&#34; _tcsset()&#34;和朋友是不便携的;即使在仅使用Windows的代码中,您也不太可能经常看到它们。
如果可能的话,一个更好的解决方案是使用C ++&#34; std:string&#34;。
例如,
std::string tsatz = "This is a test string ";
std::fill(tsatz.begin(), tsatz.end(), '*');