65,187
社区成员




3 楼zzyx(菜农)
char b[9];
空间分配在程序栈上,任何的超过其长度的操作都会引起异常
而char *ss=new char[9];空间分配在堆上
如果指针超出分配的长度,不一定会有异常的。
16 楼zzyx(菜农)
还没清楚?
你的ss分配在heap上,不是stack上。
“Run-Time Check Failure #2 - Stack around the variable 'b' was corrupted.”
正说明你在9个长度的栈空间上,要覆盖上去10个字符(包括了一个null)
……而栈被重写可能会造成严重的问题,因此运行环境报告了这个异常。
对于ss,你分配了9个长度的堆空间上,你覆盖上去10个字符(包括了一个null),没有
报错,不等于没有错!!!
例如,假设你的代码new了一个空间A,长度为8,操作系统可能给你的地址是1000
假如你再new了一个空间B,长度为8,那么操作系统可能给你的地址是1008
现在你要对A空间strcpy一个9字节长(包括了null)的串,那么实际上这个串将
占据1000~1008的空间,也就是说,你的B中的数据被破坏了!
那么再这个情况下可能不会异常,只是你的运行结果不一定是你想要的东西了
假设B不是你分配的空间,而是你的运行程序的函数库或者操作系统自动new出来的
那么,如果你破坏了B,就有可能异常。
前边有dx说的非常清楚,没有报告异常不等于没有错误!
哎,哪位把strcpy的实现和程序栈和堆的概念讲给楼主吧
WCHAR FPSString[9] = {0};
char temp[4] = {0};
float FPS = 3.141611;
sprintf(temp,"%f",FPS);
mbstowcs(FPSString,temp,strlen(temp));
temp[3] = '\0';
wprintf(L"%s\0",FPSString);
//函数声明如下:
/*
size_t mbstowcs(
wchar_t* wcstr,
const char* mbstr,
size_t count
);
*/
//用法:
TCHAR FPSString[9] = {0};
char temp[10] = {0};
float FPS = 3.1416;
sprintf(temp,"%f",FPS);
mbstowcs(FPSString,temp,strlen(temp));
wprintf(L"%s\n",FPSString);
TCHAR FPSString[9] = {0};
int i = 999;
wsprintf(FPSString, L"%d",i);
wprintf(L"%s\n",FPSString);
#include <Windows.h>
int main()
{
WCHAR wsz[9];
float fl = 3.1416;
wsprintfW(wsz, L"%d", fl);
}
int wsprintf( LPTSTR lpOut, LPCTSTR lpFmt, ...);