| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY 
共有 469 人关注过本帖
标题:关于内存管理的问题,
收藏  订阅  推荐  打印 
Mycr
Rank: 3Rank: 3
等级:中级会员
帖子:203
积分:2184
注册:2006-9-18
关于内存管理的问题,

#include <stdio.h>
#include <string.h>
void main()
{
    char a[]="hello";
    int len=strlen(a);
    char *p;
    p=new char;

    strcpy(p,a);
    if(strcmp(p,a)==0)
        printf("相同\n");
    while(*p!='\0')
    {
        printf("%c",*p);
        p++;
    }
    //printf("%d",len);
    if(p)
        delete p;

}

为什么我添加上红色那段代码后,程序就会出错

[[italic] 本帖最后由 Mycr 于 2007-12-24 15:32 编辑 [/italic]]
搜索更多相关主题的帖子: 内存  char  printf  include  len  
2007-12-24 15:30
lonmaor
Rank: 12Rank: 12Rank: 12
来自:Zz.
等级:版主
威望:11
帖子:578
积分:5104
注册:2007-11-27

不明白你的程序要实现什么。
2007-12-24 15:57
永夜的极光
Rank: 12Rank: 12Rank: 12
等级:版主
威望:17
帖子:2666
积分:34005
注册:2007-10-9

p=new char;
这一句申请了一个字节的内存,然后p指向了这段内存

strcpy(p,a);
这一句把a复制给p,实际上已经是越界了,a要占6个字节,而p指向的位置只有一个字节是向系统申请来的,虽然整个程序是可以运行的,但是这一句是错误的.

    while(*p!='\0')
    {
        printf("%c",*p);
        p++;
    }
这一段,p直至在自增,已经指到了不是向系统申请的空间

if(p)
        delete p;
这个时候p指向的位置不是原来申请的位置,所以会出错

修改方法为:
    char *p;
    p=new char;
这两句改为
    char *p,*q;
    q=p=new char[len+1];
还有
    if(p)
        delete p;
改为
    if(q)
        delete q;

多定义一个q,指向申请内存的位置,最后把q给delete掉就行了.
c语言中的指针使用要相当的小心,很多地方一不小心就越界了

从BFS(Breadth First Study)到DFS(Depth First Study)
学习VIM中,欢迎访问我的blog  http://hi.baidu.com/newkedison
严重鄙视一切把论坛当成作业生成器和人肉搜索引擎的人
2007-12-24 16:09
灭火的风
Rank: 2
来自:杭州
等级:注册会员
帖子:150
积分:1714
注册:2006-6-15

为什么要多定义一个指针q啊?
2007-12-24 20:54
Mycr
Rank: 3Rank: 3
等级:中级会员
帖子:203
积分:2184
注册:2006-9-18

想了解内存的管理,所以写了这样一段代码进行测试.   多定义一个q ,是因为q是指向初始地址,而p使用的时候,已经移动后面去了
内存是地雷,不想踩到,唯一的办法就是将它移除!

[[italic] 本帖最后由 Mycr 于 2007-12-25 19:58 编辑 [/italic]]

2007-12-25 19:50
永夜的极光
Rank: 12Rank: 12Rank: 12
等级:版主
威望:17
帖子:2666
积分:34005
注册:2007-10-9

原帖由 [bold][underline]灭火的风[/underline][/bold] 于 2007-12-24 20:54 发表 [url=http://bbs.bc-cn.net/redirect.php?goto=findpost&pid=1159344&ptid=194059][/url]
为什么要多定义一个指针q啊?
因为我想不到更好的办法~

从BFS(Breadth First Study)到DFS(Depth First Study)
学习VIM中,欢迎访问我的blog  http://hi.baidu.com/newkedison
严重鄙视一切把论坛当成作业生成器和人肉搜索引擎的人
2007-12-25 19:58
Mycr
Rank: 3Rank: 3
等级:中级会员
帖子:203
积分:2184
注册:2006-9-18

那我的理解有没有对?

2007-12-25 19:59
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.067723 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved