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

converting a string to a char *. Heap error

本文关键字:错误 char 字符串 转换      更新时间:2023-10-16

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

检测到的堆。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()] = '';
    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;
}

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());

好吧,我似乎已经修复了它。sizeof(缓冲区)只是返回4个字节(我猜是指针的大小)。将其更改为缓冲区中的字符数似乎有效。

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