2016-12-25 277 views
-1

当我使用strcpy_s时总会出现相同的错误,Debug Assertion failed. L Buffer is too small &&0。有人可以帮我解决吗?我使用微软的Visual Studio 2012最终
error message如何调试“Debug Assertion Failed。Buffer too small”?

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; 
} 

回答

0

strcpy_s()的第二个参数似乎是缓冲区的大小指出是第一个参数。由于字符串副本将需要复制strlen(name)字符终止空字符,因此您需要提供一个缓冲区,该缓冲区至少为至少一个字符大于strlen(name)。其实你确实分配一个合适大小的缓冲区!你只是没有通知strcpy_s()这个事实。

另外,一旦你得到这个错误,你会发现你没有分配任何内存Number。因为操作可能是昂贵的,例如,当字符串非常长时,我还建议实际上安全的结果为strlen(str)

0

首先,strcpy_s在调试模式已经检查了(strlen(name)指定的长度是不够的,适合name +终止\0,所以它断言。

其次,您没有为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并节省您自己的这些头痛。

相关问题