数组越界与编译器

mutou55 2010-11-12 05:46:01
用visual 2008编译如下程序时:
int main(void)
{
char a[7]; //问题就在这里,只要a数组设置的小于原字串大小就会产生问题
strcpy(a,"message");
printf("%s\n", a);
//while (1);
return 0;
}

char *strcpy(char *strDest, char const *strSrc)
{
char *address;
address = strDest;
assert((strDest != NULL) && (strSrc != NULL));
while ((*strDest++ = *strSrc++) != '\0');
return address;
}

在main函数中,用strcpy复制字符串,产生了数组越界问题。单步执行,在前面没有问题,
只在main函数结束的时候编译器弹出对话框

Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted.

不知道编译器说的是什么意思

相同的程序而用c-free编译器编译时,弹出说某地址不可写。但是有时虽然a数组设置的比较小,运行时肯定也越界,
但不报错,不知道为什么。

为什么会是在main结束时报错,而不是越界时就报错呢?
...全文
57 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
mutou55 2010-11-12
  • 打赏
  • 举报
回复
非常感谢各位老师的指点
Athenacle_ 2010-11-12
  • 打赏
  • 举报
回复
因为VC Debug编译时会使用一个检查缓冲区溢出的函数~。。。,而这个函数在推出程序之前运行~。。

熊熊大叔 2010-11-12
  • 打赏
  • 举报
回复
编译时不会抱错,是执行时抱错吧。
c语言的哲学是程序员了解一切,因此你可以用c语言干各种“违法”的事,都是允许的。c语言中的数组、指针都只是个地址,编译器不会检查是否越界的。
在执行时,VC的debug模式下会在每个函数的栈顶设置标志,在退出函数时检查标志是否被改写了,如果改写说明出错。因此只能在函数退出时检查。
在release模式下,不会进行这种检查。程序员需要为所有后果负责。
skyworth98 2010-11-12
  • 打赏
  • 举报
回复
这个跟编译器有关,局部变量分配在栈上,VC的编译器在函数退出的时候会检查栈不是不是被破坏了,所以在main结束的时候报错

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧