简单程序引出的问题,这是VC++的BUG吗?

mzlogin 2008-01-03 09:57:57
这是一个最简单的程序,
源代码如下:

#include<iostream>
#include<string>
using namespace std;

void main()
{
char a[5];
strcpy(a,"kswucfet");
cout<<a<<endl;
}

我定义的数组元素只有5个,
但是复制到它里面的字符串长度为8,
运行却没有错误,
而且这不是偶然的内存分配问题,
我试过多次,
如果数组元素定为4,
那么a最多只能装四个字符,
如果数组元素定为5,
那么a最多能装8个字符!!!
如果数组元素定为6,
那么a最多也是能装8个字符!!!

我在多套VC++系统里运行过这个程序,
情况都是如此,
这是VC++的BUG吗?
还是其它的什么既定的已知的知识?
请各位高手赐教!
...全文
95 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
mzlogin 2008-01-03
  • 打赏
  • 举报
回复
相当感谢9楼的朋友……
嗯确实,
如果我再加一行输出,
这个时候甚至把b定义为长度是5,
而我也只放长度为5的数据时编译都不能通过……
真心感谢……!!!!
mzlogin 2008-01-03
  • 打赏
  • 举报
回复
嗯谢谢大家了!!!
问题基本已经明白呵呵
嗯今天初到CSDN也是第一次发贴,
得到大家这么热心的帮助,
真的是太感动了,
嗯我对这里的大家充满信心……
zhangchuansheng 2008-01-03
  • 打赏
  • 举报
回复
只是一种内存分配的策略;
我估计在你的代码中再加上行,就会有问题了。
如下:
#include <iostream>
#include <string>
using namespace std;

void main()
{
char a[5];
strcpy(a,"kswucfet");
char b[10] = "11111111";
cout < <a < <endl;
}
waruqi 2008-01-03
  • 打赏
  • 举报
回复
加载的内存按4字节对齐,你分配5字节,则会加载8字节(4的倍数)
mzlogin 2008-01-03
  • 打赏
  • 举报
回复
嗯感谢4楼5楼的朋友,
我刚又试了下,
应该是你们说的原因,
是内存分配和对齐的方式问题,
如果数组长度定为1~4 ,内存会分配1字节即 4字符长度;
如果数组长度定为5~8 ,内存会分配2字节即 8字符长度;
如果数组长度定为9~12,内存会分配3字节即12字符长度;
……
谢谢!!!
sheenl 2008-01-03
  • 打赏
  • 举报
回复
我刚才试验了一下, 在gcc上, 我可以strcpy超过100个字符过去, 然后立刻打印出来一切正常。
lockhall 2008-01-03
  • 打赏
  • 举报
回复
内存对齐的原因。


sheenl 2008-01-03
  • 打赏
  • 举报
回复
可能是因为这样,你这样定义数组是在栈空间,你在栈上分配了比如说6个字节, 可是栈顶指针在向下长的时候, 并不是长6个字节, 而是按照某种对齐之类的规则
很可能一次长超过6个字节。多的那些字节, 你就算没分配, 还是你专用的。
mzlogin 2008-01-03
  • 打赏
  • 举报
回复
嗯我也知道讨论这个问题估计到最后不太可能有什么真正明确的答案,
可就是有些好奇……
vecshid 2008-01-03
  • 打赏
  • 举报
回复
要是数组后面的几个存储单元存有相关程序代码的话就有问题了,数组越界一定要注意~编译时没问题并不代表程序没问题,甚至一时的运行没问题也不能代表程序是没问题的
sheenl 2008-01-03
  • 打赏
  • 举报
回复
这取决于vc对内存的调度方式。
换个不同的编译器就会有不同的结果。
甚至有可能会被操作系统的内存管理方法影响。

比如说, 在有的操作系统中, 在栈空间发生内存寻址越界的时候, 内存管理单元会看这次越界究竟超出了多少字节, 在一定范围内, 内存管理单元会自动扩展栈空间来满足需要。 等等等等。

不要在这种不可预知的错误上花费精力了。
我在我的机器上用gcc试了一下

char a[5];
strcpy(a,"abcdefghijklmnopqrstuvwxyz");
cout <<a <<endl;

仍然是可以的。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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