检测到堆损坏

时间:2011-06-26 22:26:12

标签: c++

我有一个非常简单的代码,如下面的

#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[] ...请帮助!!!

3 个答案:

答案 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个字符。这导致分配的缓冲区溢出