如何调试"Debug Assertion Failed. Buffer too small"?
How to debug "Debug Assertion Failed. Buffer too small"?
当我使用strcpy_s
时总是出现同样的错误,Debug Assertion failed. L Buffer is too small &&0
。有人可以帮我解决吗?我正在使用 Microsoft Visual Studio Ultimate 2012。
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
) 不足以容纳 name
+ 终止 [=14=]
,因此它断言。
其次,您没有为 p->Number
.
预留缓冲区
Nod *p=new Nod;
p->Name=new char [strlen(name)+1];
strcpy_s(p->Name, strlen(name)+1, name); // <-- +1, to not miss the null character at the end
p->Number=new char [strlen(nr)+1]; // <-- You missed this
strcpy_s(p->Number, strlen(nr)+1, nr);
最后,使用 std::string
来解决这些令人头疼的问题。
strcpy_s()
的第二个参数似乎是指向第一个参数的 缓冲区 的大小。由于字符串复制需要复制 strlen(name)
个字符 和 一个终止空字符,因此您需要提供一个缓冲区,该缓冲区至少 比strlen(name)
大一个字符。事实上,您确实分配了一个适当大小的缓冲区!您只是没有告知 strcpy_s()
这个事实。
另外,一旦你克服了这个错误,你会发现你还没有为 Number
分配任何内存。我还建议实际保护 strlen(str)
的结果,因为操作 可能 很昂贵,例如,当字符串真的很长时。
当我使用strcpy_s
时总是出现同样的错误,Debug Assertion failed. L Buffer is too small &&0
。有人可以帮我解决吗?我正在使用 Microsoft Visual Studio Ultimate 2012。
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
) 不足以容纳 name
+ 终止 [=14=]
,因此它断言。
其次,您没有为 p->Number
.
Nod *p=new Nod;
p->Name=new char [strlen(name)+1];
strcpy_s(p->Name, strlen(name)+1, name); // <-- +1, to not miss the null character at the end
p->Number=new char [strlen(nr)+1]; // <-- You missed this
strcpy_s(p->Number, strlen(nr)+1, nr);
最后,使用 std::string
来解决这些令人头疼的问题。
strcpy_s()
的第二个参数似乎是指向第一个参数的 缓冲区 的大小。由于字符串复制需要复制 strlen(name)
个字符 和 一个终止空字符,因此您需要提供一个缓冲区,该缓冲区至少 比strlen(name)
大一个字符。事实上,您确实分配了一个适当大小的缓冲区!您只是没有告知 strcpy_s()
这个事实。
另外,一旦你克服了这个错误,你会发现你还没有为 Number
分配任何内存。我还建议实际保护 strlen(str)
的结果,因为操作 可能 很昂贵,例如,当字符串真的很长时。