将字符串转换为char *。堆错误

时间:2017-09-23 02:24:31

标签: c++

我不是c ++专家,所以我想知道是否有人可以向我解释这段代码出了什么问题。当它删除[] str时我得到一个错误

HEAP CORRUPTION DETECTED。 CRT检测到应用程序在堆缓冲区结束后写入内存。

这似乎告诉我,我的缓冲区不够大,但我不明白为什么。

char* foo() 
{
    std::string s = "01";
    char* buffer = new char[s.size()+1];
    strncpy_s(buffer, sizeof(buffer), s.c_str(), s.size());
    buffer[s.size()] = '\0';
    return buffer;
}

int main()
{
    char* str = foo()
    for (int i = 0; i < strlen(str); ++i) 
    {
        std::cout << str[i];
    }
    delete[] str;
    std::getchar();

    return 0;
}

2 个答案:

答案 0 :(得分:1)

好吧我好像已经修好了。 sizeof(缓冲区)只返回4个字节(指针I&#39;猜测的大小)。将其更改为缓冲区中的字符数似乎已经奏效。

strncpy_s(buffer, s.size() + 1, s.c_str(), s.size());

答案 1 :(得分:1)

sizeof(buffer)只返回指针的大小,而不是它指向的缓冲区的大小。缓冲区的正确大小为:

const auto bufSize = sizeof( *buffer ) * (s.size() + 1);

或者,更简单一点:

const auto bufSize = sizeof( char ) * (s.size() + 1);

正确的字符串副本如下所示:

strncpy_s(buffer, bufSize, s.c_str(), s.size());