将字符串转换为字符*。堆错误 我不是C++专家,所以我想知道有人能解释一下这个代码有什么问题。当它删除[]str时,我得到一个错误

将字符串转换为字符*。堆错误 我不是C++专家,所以我想知道有人能解释一下这个代码有什么问题。当它删除[]str时,我得到一个错误,c++,C++,检测到堆损坏。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; } in

检测到堆损坏。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;
}
char*foo()
{
std::string s=“01”;
char*buffer=新字符[s.size()+1];
strncpy_s(buffer,sizeof(buffer),s.c_str(),s.size());
缓冲区[s.size()]='\0';
返回缓冲区;
}
int main()
{
char*str=foo()
对于(int i=0;istd::cout好的,我似乎已经修复了它。sizeof(buffer)只返回4个字节(我猜是指针的大小)。将其更改为缓冲区中的字符数似乎已经奏效

strncpy_s(buffer, s.size() + 1, s.c_str(), s.size());
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());

这是你真正的代码吗?它没有编译!我的意思是你需要包含IOFSUW和String可能的复制品:请复制并粘贴你的真实代码。为什么你会首先编写这样的代码?这显然是C++代码,而不是C代码,那么为什么不返回一个<代码> STD::String < /C>?而不是<代码> char */COD>?您尝试一个非ASCII字符串(如
wchar\u t
),该代码将再次失败,因为宽字符串的元素不是每个字节。为了便于移植,应将元素数乘以单个元素的大小:
neelements*sizeof(element\u type)
。您不会因
sizeof()而受到性能损失
是一种编译时计算,您可以只编写
strcpy(buffer,s.c_str());
而不是所有的工作使用
strncpy
建议使用MSVC++环境strcpy会生成一个安全警告。我猜OP是在试图消除警告well@YePhIcK禁用此类警告将是消除这些警告的最佳方式。此示例演示了警告不会提高安全性,因为OP将正确的代码作为警告的结果变成了错误的代码。
sizeof(char)
总是1您是正确的,根据定义,
sizeof(char)==1
。我只是演示了一种通用方法