关于越界的问题

猪头小哥 2012-04-17 02:41:36
这是第一个:
#include <stdio.h>
#include <malloc.h>
#include <string.h>

char *mystrcpy(char *strDest, char *strSrc)
{
int i = 0;
char *address = NULL;
if ((NULL == strDest) || (NULL == strSrc))/* 首先判断目的字符串,只要目的字符串为空,那么就直接返回空地址 */
{
return NULL;
}
address = strDest;/* 保留目的字符串的首地址 */
while ((*strDest++ = *strSrc++) != '\0');/* 把\0也复制到目的字符串里面了 */

return address;/* 返回目的字符串的首地址 */
}

int main(void)
{
char *str1 = "abcde";
char *str2 = (char *)malloc(strlen(str1));//这个地方分配5个字节的空间,没有为'\0'分配空间,程序运行正常。
mystrcpy(str2, str1);
printf("%s\n%s\n%d\n", str1, str2,strlen(str1));

return 0;
}


第二个
#include <stdio.h>
#include <malloc.h>
#include <string.h>

char *mystrcpy(char *strDest, char *strSrc)
{
int i = 0;
char *address = NULL;
if ((NULL == strDest) || (NULL == strSrc))/* 首先判断目的字符串,只要目的字符串为空,那么就直接返回空地址 */
{
return NULL;
}
address = strDest;/* 保留目的字符串的首地址 */
while ((*strDest++ = *strSrc++) != '\0');/* 把\0也复制到目的字符串里面了 */

return address;/* 返回目的字符串的首地址 */
}

int main(void)
{
char *str1 = "abcde";
char str2[5];//这个地方也分配5个字节的空间,没有为'\0'分配空间,程序运行有bug。
mystrcpy(str2, str1);
printf("%s\n%s%d\n", str1, str2,strlen(str1));

return 0;
}


看的出来这两个程序就是只有str2的定义不同,我想问的就是为什么数组变量的越界会出现问题,而动态分配的堆越界不会出现问题呢?
...全文
112 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
majia2011 2012-04-17
  • 打赏
  • 举报
回复
没看代码,简单回复你的问题。

溢出分,栈溢出和堆溢出,栈是经常用的,如果你溢出的位置够进,函数一退出,就可以抛异常出来。

堆溢出是在free和alloc的时候系统进行检查的,因为效率问题,所以反应会慢一点。

具体的自己找资料,我说的不严谨,别当真实的记
nice_cxf 2012-04-17
  • 打赏
  • 举报
回复
越界不能保证出错,结果未知
muyi66 2012-04-17
  • 打赏
  • 举报
回复
动态堆越界照样会有问题,只是申请时系统不止给你那么一点内存(字节对齐),所以没造成严重影响。如果你在堆里越界太多了,照样要出事。

栈里数据非常密集,关键信息众多,更容易造成严重后果。

69,364

社区成员

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

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