当前位置: 代码迷 >> C语言 >> 关于内存管理的问题,
  详细解决方案

关于内存管理的问题,

热度:241   发布时间:2007-12-24 15:30:19.0
关于内存管理的问题,
#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  

----------------解决方案--------------------------------------------------------
不明白你的程序要实现什么。
----------------解决方案--------------------------------------------------------
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语言中的指针使用要相当的小心,很多地方一不小心就越界了
----------------解决方案--------------------------------------------------------
为什么要多定义一个指针q啊?
----------------解决方案--------------------------------------------------------
想了解内存的管理,所以写了这样一段代码进行测试.   多定义一个q ,是因为q是指向初始地址,而p使用的时候,已经移动后面去了
内存是地雷,不想踩到,唯一的办法就是将它移除!

[[italic] 本帖最后由 Mycr 于 2007-12-25 19:58 编辑 [/italic]]
----------------解决方案--------------------------------------------------------
原帖由 [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啊?

因为我想不到更好的办法~
----------------解决方案--------------------------------------------------------
那我的理解有没有对?
----------------解决方案--------------------------------------------------------
  相关解决方案