char a[21];
memset(a,'1',4096);
和
char a[21];
memset(a,'1',4096);
char b[21];
strcpy(b,a);哪段代码会报内存超限,为啥?请各位达人解释一下!
memset(a,'1',4096);
和
char a[21];
memset(a,'1',4096);
char b[21];
strcpy(b,a);哪段代码会报内存超限,为啥?请各位达人解释一下!
Security Note Make sure that the destination buffer has enough room for at least count characters. 我建议不要这样写代码,象第一种那样的,不是没事找崩溃吗,让程序员自己保证有足够内存,否则可能产生的结果未知
memset(a,'1',4096); 这里a的内存只有21个,如果你memset处理21位的内存已经被系统标记为使用状态就可能会出现内存访问错误。
char a[21];
memset(a,'1',21);
和
char a[21];
memset(a,'1',21);
char b[21];
strcpy(b,a);
char a[21];
memset(a,'1',20);
a[20] = '\0';
char b[21];
strcpy(b,a);
void a(){
char a[21];
memset(a,'1',4096);
}void b(){
char a[21];
memset(a,'1',4096);
char b[21];
strcpy(b,a);
}
void main()
{
a();
b();
}
你就会发现函数返回了0x00000001地址,调试器会报告错误,如果非调试状态下,系统会报内存访问无效.
{
char a[21];
memset(a,'j',4096);
char b[21];
strcpy(b,a);
}
catch(Exception &E)
{
MessageBox(Application->Handle,"Error","Err",MB_OK);
}我用这样,却捕获不到异常,郁闷中……
严重破坏堆栈,这样整个函数都无法返回啦。
捕捉异常用
char c[4096];
try
{
char a[21];
memset(a,'j',4096);
char b[21];
strcpy(b,a);
}
catch(...)
{
MessageBox(Application->Handle,"Error","Err",MB_OK);
}
编译都可通过,但是你在读取时 字符串没有结束符
会造成读取出错,程序不知道字符串哪里结束,造成内存越界
try
{
char a[21];
memset(a,'j',4096);
char b[21];
strcpy(b,a);
}
catch(...)
{
MessageBox(Application->Handle,"Error","Err",MB_OK);
} 这个好像同样没用撒,
不知如何才能捕获到这个异常?
你上面的情况是,
char a[21];
memset(a,'1',4096); //这里为什么要4096??这个把其他内存空间的内容也给设置为1了,那个空间存的是什么是未知的。