关于内存管理的问题,
#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]]
----------------解决方案--------------------------------------------------------
不明白你的程序要实现什么。
----------------解决方案--------------------------------------------------------
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啊?
为什么要多定义一个指针q啊?
因为我想不到更好的办法~
----------------解决方案--------------------------------------------------------
那我的理解有没有对?
----------------解决方案--------------------------------------------------------