我有一个非常简单的代码,如下面的
#include <iostream>
struct mystruct
{
char *m1;
};
void pass(char **, const char *);
int _tmain(int argc, _TCHAR* argv[])
{
char *p = NULL;
pass (&p, "hello");
struct mystruct *mP = NULL;
mP = new mystruct;
pass ( &mP->m1, "hi");
//std::cout << mP->m1;
return 0;
}
void pass (char **p1, const char *q1)
{
*p1 = new char (3);
*p1[2] = '\0';
strcpy (*p1,q1);
std::cout << strlen (*p1);
std::cout << *p1;
delete []*p1;
}
并在达到heap corruption detected!
时收到错误delete[]
...请帮助!!!
答案 0 :(得分:8)
*p1 = new char (3);
分配1个char并用值3初始化它。
你的意思是
*p1 = new char [3]; //square brackets
更新:
另一个错误就是这一行
*p1[2] = '\0';
虽然这条线完全没必要(strcpy会处理你关心的问题),但由于[]和*的优先顺序,这是错误的。你的意思是
(*p1)[2] = '\0';
答案 1 :(得分:4)
在pass
中,您尝试为p1
分配3个字符,但之后您正在使用strcpy
复制字符串,使其长于此值。您需要将q1
的长度传递给pass
并进行相应的分配。
此外,您需要执行*p1 = new char[SIZE];
其中SIZE
是一个足以将字符串存储在q1
中的值。
答案 2 :(得分:1)
*p1 = new char (3);
调用char构造函数并分配一个char。
strcpy (*p1,q1);
你正在复制“你好”,这是6个字符。这导致分配的缓冲区溢出