高质量C /C 编程指南中的疑问,忘高人指点,提问如下

[复制链接]
查看11 | 回复3 | 2011-3-5 06:50:31 | 显示全部楼层 |阅读模式
书中是这样描述的,

char *p = (char *) malloc(100);

strcpy(p, “hello”);

free(p);
// p 所指的内存被释放,但是p所指的地址仍然不变



if(p != NULL) // 没有起到防错作用

{

strcpy(p, “world”);// 出错

}

但是我自己在VC6里面调试:代码如下
int main(int argc, char* argv[])
{
char *p = (char *) malloc(100);
strcpy(p, \"hello\");
free(p);

if(p != NULL)
{

strcpy(p, \"world\");
}
printf(\"%s\\n\",p);

return 0;
}
程序能够正常输出“world”,

strcpy(p, \"world\");书中说这句会出错,既然是野指针,为什么能够运行呢?望大牛们能够详细讲解一下
回复

使用道具 举报

千问 | 2011-3-5 06:50:31 | 显示全部楼层
<pre id=\"best-answer-content\" class=\"reply-text mb10\">这里是否会有错误报告,和p指向的地址是否能访问有关。

一般情况下,如果p指向的空间,被释放后,直接再使用,且没有溢出,很可能不会出错。你所访问的数据,就是你原本残留的数据。

但是,如果p指向的空间,被重新分配给别的程序了,就很可能出错。尤其是当该空间你不再具备读的权限时,系统则肯定会报错。

你应该有这样一种经验:定义一个字符数组:char a[10] = {\'1\',\'2\',\'3\',\'4\',\'5\',\'6\',\'7\',\'8\',\'9\',\'A\'};
你访问a[0]到a[9]时,不论是实际上还是逻辑上,都是正常的。但是你访问a[10],a[11],a[12]...时,也是可以访问的,而且有数值输出,至于到什么地方会报错,取决于哪个地址空间你没有读的权限。因此,如果你把a用%s形式输出,很可能看到\'A\'后面有一大堆的乱七八糟的字符。
回复

使用道具 举报

千问 | 2011-3-5 06:50:31 | 显示全部楼层
<pre class=\"replyask-text\" id=\"content-819383\">但我的运行结果也是正常的,为什么?
回复

使用道具 举报

千问 | 2011-3-5 06:50:31 | 显示全部楼层
<pre class=\"replyask-text\" id=\"content-819511\">这是DEBUG环境下,很多内存访问错误不会出现。

不要在调试下运行看看。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行