首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于越界的有关问题

2012-04-21 
关于越界的问题这是第一个:C/C++ code#include stdio.h#include malloc.h#include string.hchar *my

关于越界的问题
这是第一个:

C/C++ code
#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;} 


第二个
C/C++ code
#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的定义不同,我想问的就是为什么数组变量的越界会出现问题,而动态分配的堆越界不会出现问题呢?

[解决办法]
动态堆越界照样会有问题,只是申请时系统不止给你那么一点内存(字节对齐),所以没造成严重影响。如果你在堆里越界太多了,照样要出事。

栈里数据非常密集,关键信息众多,更容易造成严重后果。
[解决办法]
越界不能保证出错,结果未知

热点排行
Bad Request.