使用_tcsset时运行时崩溃

时间:2015-10-26 09:08:23

标签: c++ visual-studio-2010 visual-c++

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来自外部,是否有办法?

我是初学者。我能得到的任何帮助都非常感谢。提前谢谢。

2 个答案:

答案 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(), '*');