Visual c++ 如何处理此错误-检测到堆损坏:在正常块(#136)之后 void main(){ char*p; p=新字符[3]; strcpy_s(p,sizeof(p),“AB”); cout

Visual c++ 如何处理此错误-检测到堆损坏:在正常块(#136)之后 void main(){ char*p; p=新字符[3]; strcpy_s(p,sizeof(p),“AB”); cout,visual-c++,Visual C++,根据我的Igor和Han的评论,在strcpy\s函数中使用sizeof(p)实际上是您的问题。p是char*,执行sizeof(p)返回指针的大小(通常是4或8,取决于架构),而不是所分配阵列的大小。在调试版本中,状态的文档: 这些函数的调试版本首先使用0xFE填充缓冲区。若要禁用此行为,请使用_CrtSetDebugFillThreshold 因此,运行时将把比分配的数组大的4(或8)个字节填入p,从而损坏堆。sizeof(p)不是您的strcpy\u s中的“正确”语句-因为p是一个字符*

根据我的Igor和Han的评论,在
strcpy\s
函数中使用
sizeof(p)
实际上是您的问题。
p
char*
,执行
sizeof(p)
返回指针的大小(通常是4或8,取决于架构),而不是所分配阵列的大小。在调试版本中,状态的文档:

这些函数的调试版本首先使用0xFE填充缓冲区。若要禁用此行为,请使用_CrtSetDebugFillThreshold


因此,运行时将把比分配的数组大的4(或8)个字节填入
p
,从而损坏堆。

sizeof(p)
不是您的
strcpy\u s
中的“正确”语句-因为
p
是一个字符*,所以它总是给出4或8,这取决于架构,而不是分配的数组的大小。不过,这并不能解释堆损坏。@MuertoExcobito可能
strcpy\u
零初始化整个缓冲区(可能只在调试版本中)。这可以解释溢出。不仅可能,它确实是这样做的。
void main(){
    char *p;
    p = new char[3];

    strcpy_s(p, sizeof(p), "AB");
    cout << p << endl << "input : ";
    cin.get(p, 3);

    delete []p;
}