关于strcpy会不会越界的问题

java787 2016-03-10 08:43:27
先定义一个结构体
struct INFO{
public:
char name[10];//:名字
char gender[10];//:性别
};
void test()
{
INFO info={"",""}; //这样初始化后,把name gender初始为空串
strcpy(info.name,"aaaaaaa");//在初始为空串后,复制内容到name是否会内存溢出或越界
当多次strcpy后 ,超过多少字符会内存越界,是超过初始设置的10个字符, 还是永远不会越界?
}

我的问题就是 结构体设置name为10字符,当多次strcpy后
INFO info={"",""}; //这样初始化后
strcpy(info.name,"a");//此时会不会越界
strcpy(info.name,"xiaoming");//此时会不会越界
strcpy(info.name,"1234567890abcdefg");//此时会不会越界

是以结构体内name定义的10字符为标准 还是当strcpy上一次的字符大小,还是永远不会越界?
...全文
489 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-03-11
  • 打赏
  • 举报
回复
引用 4 楼 yuelengdihai 的回复:
那就用strncpy
终于找到组织了!
paschen 版主 2016-03-11
  • 打赏
  • 举报
回复
strcpy不会帮你检查缓冲区是否足够,如果不够就会发生缓冲区溢出 如果需要确保安全,可以使用strcpy_s
cocoabird 2016-03-11
  • 打赏
  • 举报
回复
那就用strncpy
pengzhixi 2016-03-11
  • 打赏
  • 举报
回复
超过数组大小就肯定越界
sdghchj 2016-03-11
  • 打赏
  • 举报
回复
初始化并不影响变量本身的字节大小。。。
小灸舞 2016-03-10
  • 打赏
  • 举报
回复
strcpy(info.name,"a");//此时不会越界
strcpy(info.name,"xiaoming");//此时也不会越界,多次复制并不影响之后的赋值,只要不超过给定的数组长度
strcpy(info.name,"1234567890abcdefg");//此时会越界,但编译可以通过,可能产生运行错误

strcpy函数中是这样实现拷贝的:
while ((*strDest++ = *strSrc++) != '\0')
这个循环会一直执行,直到循环条件为空,即'\0',也就是说,如果strDest所指的存储空间不够大的话,这个函数会将strSrc中的部分内容拷贝到strDest所指内存空间后面的内存中。而strDest所指空间后面的内存却是不可知的,有可能已经被其他资源占用了,这样就会破坏原先存储的内容,导致系统崩溃。
因为strcpy在执行字符串拷贝的时候,会从strSrc所指位置开始,检测当前内存单元中存储的数据是否为'\0'。如果不为'\0',则将这个内存单元中的数据拷贝到strDest所指向的内存中。如果strSrc中存储的字符串长度大于dst所申请的内存空间的话,就会产生越界,造成不可预知的后果。

65,186

社区成员

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

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