c++ - 如何调试 "Debug Assertion Failed. Buffer too small"?

标签 c++ visual-c++ buffer assertion

当我使用strcpy_s 时总是出现相同的错误,Debug Assertion failed。 L 缓冲区太小 &&0。有人可以帮我解决吗?我正在使用 Microsoft Visual Studio Ultimate 2012。
error message

struct Nod{
    char *Number;
    char *Name;
    Nod *drt, *stg;
};



void Insert(Nod *&p, char* n, char nr [])
{
    if(p==0 )
        p=makeNod(n, nr);
    else
    {
        ...
    }   
}

Nod * makeNod(char *name, char nr[])
{
    Nod *p=new Nod;
    p->Name=new char [strlen(name)+1];
    strcpy_s(p->Name, strlen(name), name);  //Assertion failed          
    strcpy_s(p->Number, strlen(nr), nr);
    p->stg=p->drt=0;
    return p;  
}
int main()
{

    Nod *p=0;
    int c;
    char nr[9];
    char*name=new char [20];
    cin >> c;
    while(c!=0)
    {
        cout << "Name:  "<< endl;
        cin >> name;
        cout << "Number:  "<< endl;
        cin >> nr;
        Insert(p, name, nr);
        cin >> c;
    }
    return 0;
}

最佳答案

strcpy_s() 的第二个参数似乎是指向第一个参数的缓冲区 的大小。由于字符串复制将需要复制 strlen(name) 个字符 一个终止空字符,因此您需要提供一个 至少strlen(name) 大一个字符。事实上,您确实分配了一个适当大小的缓冲区!您只是没有将这一事实告知 strcpy_s()

此外,一旦您解决了这个错误,您会发现您还没有为 Number 分配任何内存。我还建议实际保护 strlen(str) 的结果,因为该操作可能 开销很大,例如,当字符串非常长时。

关于c++ - 如何调试 "Debug Assertion Failed. Buffer too small"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41324917/

相关文章:

c# - 为 C++ DLL 实现回调 C# 函数

c - 为什么我无法禁用堆栈保护?

javascript - Node typescript 缺少构造签名(新缓冲区)

c++ - 使用 DEFINE_string 是什么意思

c++ - 设置表单大小以适合控件

c++ - wstring 的 isupper 和 islower

c++ - 如何定义 qmake 的库搜索目录?

json - nodejs JSON.parse(data_from_TCP_socket)

c# - 手工翻译代码的技巧

c++ - 错误:在 CComVariant::Copy 中迭代 CComSafeArray 时出现 "bad variable type"