加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 将堆栈字符串与堆串串联给出奇数结果

发布时间:2020-12-16 03:22:44 所属栏目:百科 来源:网络整理
导读:我相信以下有一个理性的解释,但我有点困惑. 问题在于创建一个_TCHAR [CONSTANT],一个_TCHAR *的函数,并连接它们并返回结果. 由于某种原因,来自_tmain()的whatTheHeck()的调用返回乱码. _TCHAR* whatTheHeck(_TCHAR* name) { _TCHAR Buffer[BUFSIZE]; DWORD d
我相信以下有一个理性的解释,但我有点困惑.

问题在于创建一个_TCHAR [CONSTANT],一个_TCHAR *的函数,并连接它们并返回结果.

由于某种原因,来自_tmain()的whatTheHeck()的调用返回乱码.

_TCHAR* whatTheHeck(_TCHAR* name) {
    _TCHAR Buffer[BUFSIZE];
    DWORD dwRet;
    dwRet = GetCurrentDirectory(BUFSIZE,Buffer);
    _TCHAR* what = new _TCHAR[BUFSIZE];
    what = _tcscat(Buffer,TEXT(""));
    what = _tcscat(what,name);
    return what;
}

int _tmain(int argc,_TCHAR* argv[]) {

    _TCHAR* failure = whatTheHeck(TEXT("gibberish);")); // not again ..
    _tprintf(TEXT("|--> %sn"),failure);

    _TCHAR* success = createFileName(TEXT("readme.txt")); // much better
    _tprintf(TEXT("|--> %sn"),success);

    return 0;
}

相比之下,当堆东西按预期工作时.

_TCHAR* createFileName(_TCHAR* name) {
    _TCHAR* Buffer = new _TCHAR[BUFSIZE];
    DWORD dwRet;
    dwRet = GetCurrentDirectory(BUFSIZE,Buffer);
    Buffer = _tcscat(Buffer,TEXT(""));
    Buffer = _tcscat(Buffer,name);
    return Buffer;
}

为什么有区别?

是因为_tcscat()连接内存地址而不是其内容并返回清除堆栈?

解决方法

你的代码有很多问题.让我们分开,我们应该:
_TCHAR* whatTheHeck(_TCHAR* name)   // We're inside a local scope
{
    _TCHAR Buffer[BUFSIZE];         // "Buffer" has automatic storage

    _TCHAR* what = new _TCHAR[BUFSIZE];  // "what" points to newly allocated dyn. memory

    what = _tcscat(Buffer,TEXT(""));  // Oh no,we overwrite "what" - leak!
                                         // Now what == Buffer.

    what = _tcscat(what,name);  // Equivalent to "_tcscat(Buffer,name)"

    return Buffer;               // WTPF? We're returning a local automatic!
 }

正如你所看到的,你们都是引起内存泄漏的一个有意思和鲁莽的新功能,你也在一生之后返回一个本地对象的地址!

我强烈推荐

阅读documentation for strcat,了解“来源”和“目的地”,>不使用strcat,而是像strncat一样更安全的版本,>不使用strncat,而是std :: string.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读