Visual c++ 如何处理此错误-检测到堆损坏:在正常块(#136)之后 void main(){ char*p; p=新字符[3]; strcpy_s(p,sizeof(p),“AB”); cout
根据我的Igor和Han的评论,在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是一个字符*
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;
}